NHibernate (3.1.0.4000) NullReferenceException с использованием Query <> и NHibernate Facility

У меня проблема с 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.

8
задан Bronumski 6 July 2012 в 15:13
поделиться