Ich habe ein Problem mit NHibernate, für das ich anscheinend keine Lösung finden kann. In meinem Projekt habe ich eine einfache Entität (Batch), aber wann immer ich versuche, den folgenden Test auszuführen, erhalte ich eine Ausnahme. Ich habe versucht, ein paar verschiedene Möglichkeiten, eine ähnliche Abfrage durchzuführen, aber fast identische Ausnahme für alle (es unterscheidet sich in der LINQ-Methode ausgeführt wird).
Der erste Test:
[Test]
public void QueryLatestBatch()
{
using (var session = SessionManager.OpenSession())
{
var batch = session.Query<Batch>()
.FirstOrDefault();
Assert.That(batch, Is.Not.Null);
}
}
Die Ausnahme:
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)
Der zweite 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);
}
}
Die Ausnahme:
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)
Diese geht jedoch vorbei (mit 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));
}
}
Die Verwendung der QueryOver<>-API ist gar nicht so schlecht, aber ich bin etwas verblüfft, dass die Query<>-API nicht funktioniert, was irgendwie traurig ist, da die First()-Operation sehr prägnant ist und unsere Entwickler LINQ wirklich mögen.
Ich hoffe wirklich, dass es eine Lösung für dieses Problem gibt, da es seltsam erscheint, wenn diese Methoden bei einem so einfachen Test versagen.
EDIT
Ich verwende Oracle 11g, meine Mappings werden mit FluentNHibernate durchgeführt, das über Castle Windsor mit der NHibernate Facility registriert ist. Wie ich schon schrieb, funktioniert die Abfrage perfekt mit der QueryOver<> API, aber nicht über LINQ.