gpt4 book ai didi

NHibernate (3.1.0.4000) NullReferenceException 使用 Query<> 和 NHibernate Facility

转载 作者:行者123 更新时间:2023-12-03 20:22:11 24 4
gpt4 key购买 nike

我有 NHibernate 的问题,我似乎找不到任何解决方案。
在我的项目中,我有一个简单的实体 (Batch),但是每当我尝试运行以下测试时,都会出现异常。
我尝试了几种不同的方法来执行类似的查询,但几乎所有的异常都相同(不同的是执行哪种 LINQ 方法)。

第一个测试:

[Test]
public void QueryLatestBatch()
{
using (var session = SessionManager.OpenSession())
{
var batch = session.Query<Batch>()
.FirstOrDefault();

Assert.That(batch, Is.Not.Null);
}
}

异常(exception):
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);
}
}

异常(exception):
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,我的映射是使用 FluentNHibernate 完成的,该 FluentNHibernate 通过 CaSTLe Windsor 注册到 NHibernate Facility。
正如我所写的,奇怪的是查询与 QueryOver<> API 完美配合,但不是通过 LINQ。

最佳答案

与 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 扩展方法并自己创建它。他们真的只是单行:

public static class NHibernateLinqExtensions
{
/// <summary>
/// Performs a LINQ query on the specified type.
/// </summary>
/// <typeparam name="T">The type to perform the query on.</typeparam>
/// <param name="session"></param>
/// <returns>A new <see cref="IQueryable{T}"/>.</returns>
/// <remarks>This method is provided as a workaround for the current bug in the NHibernate LINQ extension methods.</remarks>
public static IQueryable<T> Linq<T>(this ISession session)
{
return new NhQueryable<T>(session.GetSessionImplementation());
}

/// <summary>
/// Performs a LINQ query on the specified type.
/// </summary>
/// <typeparam name="T">The type to perform the query on.</typeparam>
/// <param name="session"></param>
/// <returns>A new <see cref="IQueryable{T}"/>.</returns>
/// <remarks>This method is provided as a workaround for the current bug in the NHibernate LINQ extension methods.</remarks>
public static IQueryable<T> Linq<T>(this IStatelessSession session)
{
return new NhQueryable<T>(session.GetSessionImplementation());
}
}

然后,当我需要做一个 LINQ 查询时,我只使用 session.Linq<EntityType>()而不是 session.Query<EntityType> .

希望它可以帮助与我处于相同情况的人。

关于NHibernate (3.1.0.4000) NullReferenceException 使用 Query<> 和 NHibernate Facility,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5549404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com