У меня проблема с NHibernate, я не могу найти решение. В моем проекте у меня есть простая сущность (Batch), но всякий раз, когда я пытаюсь запустить следующий тест, я получаю исключение. Я использовал несколько разных способов выполнить похожий запрос, но почти идентичное исключение для всех (он отличается от того, какой метод 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:
[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));
}
}
Использование API QueryOver <> совсем неплохо, но меня просто сбивает с толку то, что Query <> API не работает, что несколько печально, поскольку операция First () очень лаконична, и нашим разработчикам действительно нравится LINQ.
Я действительно надеюсь, что есть решение этой проблемы, поскольку это кажется странным, если эти методы не выдерживают такой простой проверки.
EDIT
Я использую Oracle 11g, мои сопоставления выполняются с помощью FluentNHibernate, зарегистрированного через Castle Windsor с помощью NHibernate Facility. Как я уже писал, странно то, что запрос отлично работает с API QueryOver <>, но не через LINQ.