NHibernatを継承と組み合わせて使用しています。つまり、互いに継承する親オブジェクトと子オブジェクトがありますが、それぞれに独自のマッピングファイルがあるため、別々のテーブルが作成されます。NHibernateと継承で.Any()を使用する
私は次の操作を行う.ANY()機能に問題を抱えていた。
var value = session.Query<ParentObject>().Any(t => t.Name.Equals(name));
私はNHibernateのソースコードをデバッグしてきたと私は、クエリ私はオブジェクトに対して実行するときことが判明それを継承する他のすべてのクラスもループします。これは、.Any関数呼び出しの場合、ブール値の結果セットが一杯になることを意味します。しかし、奇妙なことに、DefaultQueryProvider.cs(行125)では次のようなことが起こります:return results [0];
最初の結果は私のChildObjectの結果です。したがって、私のParentObjectの結果は完全に無視されます。
私は、この動作を証明するためにunittestのを作った:
[TestMethod]
public void TestInheritance()
{
var name = "test";
var sessionFactory = CreateSessionFactory(database2);
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
var testObject = new ParentObject();
testObject.SetName(name);
session.SaveOrUpdate(testObject);
transaction.Commit();
var value = session.Query<ParentObject>().Any(t => t.Name.Equals(name));
Assert.IsTrue(value);
}
}
あなたはこのことを期待していないが、このユニットテストが失敗しました。 他のクラスが継承していないクラスで同じコードをテストすると、単体テストが成功します。
var value = session.Query<ParentObject>().FirstOrDefault(t => t.Name.Equals(name)) != null
を私はちょうど任意の()機能を使用したい:
私が使用して、このための回避策を行うことができます。
誰にもこの解決策がありますか?
はまた、NHibernateのバグトラッカーに追加:https://nhibernate.jira.com/browse/NH-3939
あなたのケースを解決するのに最適です。今では多型を必要とする人にとっては、NHibernateでバグ修正が必要だと思います。 –