我有一个NHibernate的问题,我似乎无法找到任何解决方案。 在我的项目中,我有一个简单的实体(批处理),但每当我尝试运行以下测试时,我都会遇到异常。 我发现了几种不同的方式来执行类似的查询,但几乎相同的异常(它不同于执行LINQ方法)。NHibernate(3.1.0.4000)NullReferenceException使用查询<>和NHibernate设施
第一测试:
[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是不坏,但我只是有种莫名奇妙查询<> API ISN”工作,这是有点伤心,因为First()操作非常简洁,我们的开发人员非常喜欢LINQ。
我真的很希望有这样的解决方案,因为如果这些方法没有通过如此简单的测试就显得很奇怪。
编辑我使用Oracle 11g
,我的映射通过温莎城堡与NHibernate的机构登记FluentNHibernate完成。 正如我写的,奇怪的是,查询完全符合QueryOver <> API,但不通过LINQ。
您的映射,配置或代码的其他部分出现问题,您没有显示,因为所有这些方法对我来说都很好(在NH测试中) – 2011-04-05 12:51:14
我的设置有些问题是严重错误的。我现在无法使用Query <>上的任何方法。我想我的参考文献有问题。 – Siewers 2011-04-05 19:43:43
我发现问题是/是。显然,我在NHibernateFacility中做了错误的事情,因为那是造成所有问题的原因。如果我在设施外创建会话工厂,我可以使用Query <>进行查询,但使用它,它不起作用! – Siewers 2011-04-05 20:56:05