NHibernateに問題があり、解決策が見つからないようです。私のプロジェクトには単純なエンティティ(バッチ)がありますが、次のテストを実行しようとすると、例外が発生します。同様のクエリを実行するためにいくつかの異なる方法を試しましたが、すべての例外がほぼ同じです(実行される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)
2番目のテスト:
[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の使用はまったく悪いことではありませんが、First()操作が非常に簡潔であるため、Query <> APIが機能していないことに少し戸惑っています。これは、ちょっと悲しいことです。 LINQを本当に楽しんでください。
これらのメソッドがこのような単純なテストに失敗した場合は奇妙に思われるので、これに対する解決策があることを本当に望んでいます。
編集
Oracle 11gを使用しています。マッピングは、CastleWindsorを介してNHibernateファシリティに登録されたFluentNHibernateを使用して行われます。私が書いたように、奇妙なことに、クエリはQueryOver <> APIで完全に機能しますが、LINQでは機能しません。