我对 NHibernate 有疑问,我似乎找不到任何解决方案。在我的项目中,我有一个简单的实体(批处理),但是每当我尝试运行以下测试时,都会出现异常。我已经尝试了几种不同的方法来执行类似的查询,但几乎所有的例外都是相同的(它执行的 LINQ 方法不同)。
第一个测试:
[Test]
public void QueryLatestBatch()
{
using (var session = SessionManager.OpenSession())
{
var batch = session.Query<Batch>()
.FirstOrDefault();
Assert.That(batch, Is.Not.Null);
}
}
例外:
System.NullReferenceException : Object reference not set to an instance of an object.
at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, ref IQuery query, ref NhLinqExpression nhQuery)
at NHibernate.Linq.NhQueryProvider.Execute(Expression expression)
at System.Linq.Queryable.FirstOrDefault(IQueryable`1 source)
第二个测试:
[Test]
public void QueryLatestBatch2()
{
using (var session = SessionManager.OpenSession())
{
var batch = session.Query<Batch>()
.OrderBy(x => x.Executed)
.Take(1)
.SingleOrDefault();
Assert.That(batch, Is.Not.Null);
}
}
例外:
System.NullReferenceException : Object reference not set to an instance of an object.
at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, ref IQuery query, ref NhLinqExpression nhQuery)
at NHibernate.Linq.NhQueryProvider.Execute(Expression expression)
at System.Linq.Queryable.SingleOrDefault(IQueryable`1 source)
但是,这个正在传递(使用 QueryOver<>):
[Test]
public void QueryOverLatestBatch()
{
using (var session = SessionManager.OpenSession())
{
var batch = session.QueryOver<Batch>()
.OrderBy(x => x.Executed).Asc
.Take(1)
.SingleOrDefault();
Assert.That(batch, Is.Not.Null);
Assert.That(batch.Executed, Is.LessThan(DateTime.Now));
}
}
使用 QueryOver<> API 一点也不差,但我有点困惑 Query<> API 不工作,这有点令人难过,因为 First() 操作非常简洁,我们的开发人员真的很喜欢 LINQ。
我真的希望有一个解决方案,因为如果这些方法未能通过如此简单的测试似乎很奇怪。
编辑
我使用的是 Oracle 11g,我的映射是使用通过 Castle Windsor 和 NHibernate 设施注册的 FluentNHibernate 完成的。正如我所写,奇怪的是查询与 QueryOver<> API 完美配合,但不能通过 LINQ。