NHibernate (3.1.0.4000) 使用 Query<> 时出现 NullReferenceException和 NHibernate 设施
我的 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。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
与 NHibernate Facility 2.0RC(和以前的版本)一起使用的 NHibernate 3.1.0.4000 的 LINQ 扩展方法的当前实现存在问题(请参阅:https://nhibernate.jira.com/browse/NH-2626 和讨论:http://groups.google.com/group/castle-project-devel/browse_thread/thread/ac90148a8d4c8477)
我正在使用的修复目前的方法是简单地忽略 NHibernate 提供的 LINQ 扩展方法并自己创建它。它们实际上只是一句台词:
然后,当我需要执行 LINQ 查询时,我只需使用
session.Linq()
而不是session.Query< /代码>。
希望它能帮助那些和我有同样情况的人。
There is an issue with the current implementation of the LINQ extensionmethods for NHibernate 3.1.0.4000 used together with NHibernate Facility 2.0RC (and previous versions) (see: https://nhibernate.jira.com/browse/NH-2626 and discussion here: http://groups.google.com/group/castle-project-devel/browse_thread/thread/ac90148a8d4c8477)
The fix I am using at the moment is to simply ignore the LINQ extensionmethods provided by NHibernate and create it myself. They're really just one-liners:
Then, when I need to do a LINQ query, I just use
session.Linq<EntityType>()
instead ofsession.Query<EntityType>
.Hope it helps someone in the same situation that I was.
我发现了以下内容:http://groups.google.com/ group/castle-project-users/browse_thread/thread/5efc9f3b7b5d6a08
显然,当前版本的 NHibernate Facility 和 NHibernate 3.1.0.4000 存在问题。
我想我只能等待修复了:)
I found the following: http://groups.google.com/group/castle-project-users/browse_thread/thread/5efc9f3b7b5d6a08
Apparently there is an issue with the current version of the NHibernate Facility and NHibernate 3.1.0.4000.
I guess I'll just have to wait for a fix :)