8

我有一个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。

+0

您的映射,配置或代码的其他部分出现问题,您没有显示,因为所有这些方法对我来说都很好(在NH测试中) – 2011-04-05 12:51:14

+0

我的设置有些问题是严重错误的。我现在无法使用Query <>上的任何方法。我想我的参考文献有问题。 – Siewers 2011-04-05 19:43:43

+0

我发现问题是/是。显然,我在NHibernateFacility中做了错误的事情,因为那是造成所有问题的原因。如果我在设施外创建会话工厂,我可以使用Query <>进行查询,但使用它,它不起作用! – Siewers 2011-04-05 20:56:05

回答

11

没有与目前执行的LINQ extensionmethods NHibernate的3.1.0.4000的问题与NHibernate设施2.0RC(和以​​前的版本一起使用)(请参阅: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>

希望它能帮助某人和我一样。

+0

确实有帮助!谢谢 – Henrik 2011-04-07 10:34:18

+0

谢谢!做得好! – Kimi 2011-05-12 10:09:29