Sie*_*ers 8 nhibernate castle-windsor linq-to-nhibernate oracle11g windsor-nhfacility
我有NHibernate的问题,我似乎无法找到任何解决方案.在我的项目中,我有一个简单的实体(批处理),但每当我尝试运行以下测试时,我都会遇到异常.我已经尝试了几种不同的方法来执行类似的查询,但几乎所有的异常(它与执行的LINQ方法不同).
第一次测试:
[Test]
public void QueryLatestBatch()
{
using (var session = SessionManager.OpenSession())
{
var batch = session.Query<Batch>()
.FirstOrDefault();
Assert.That(batch, Is.Not.Null);
}
}
Run Code Online (Sandbox Code Playgroud)
例外:
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)
Run Code Online (Sandbox Code Playgroud)
第二个测试:
[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);
}
}
Run Code Online (Sandbox Code Playgroud)
例外:
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)
Run Code Online (Sandbox Code Playgroud)
但是,这个传递(使用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));
}
}
Run Code Online (Sandbox Code Playgroud)
使用QueryOver <> API一点也不差,但我有点困惑的是Query <> API不起作用,这有点令人难过,因为First()操作非常简洁,而且我们的开发人员真的很喜欢LINQ.
我真的希望有一个解决方案,因为如果这些方法失败了这么简单的测试似乎很奇怪.
编辑
我正在使用Oracle 11g,我的映射是通过使用NHibernate Facility在Castle Windsor注册的FluentNHibernate完成的.正如我所写,奇怪的是查询与QueryOver <> API完美配合,但不能通过LINQ.
Sie*_*ers 11
NHibernate 3.1.0.4000的LINQ扩展方法的当前实现存在一个问题,该方法与NHibernate Facility 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());
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当我需要进行LINQ查询时,我只是使用session.Linq<EntityType>()而不是session.Query<EntityType>.
希望它可以帮助处于同样情况的人.
| 归档时间: |
|
| 查看次数: |
1904 次 |
| 最近记录: |