1

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

答えて

0

答えが見つかりました。あなたがマッピングクラス(私の場合はFluentNhibernate)上で次の手順を実行して、継承の動作を無効にすることができ :

Polymorphism.Explicit(); 
+0

あなたのケースを解決するのに最適です。今では多型を必要とする人にとっては、NHibernateでバグ修正が必要だと思います。 –

0

ここでの問題は、あなたがあなたのエンティティとしてParentObjectを使用することです。

session.Query<ParentObject>().ToList() 

を実行しながら、あなたはNHProfilerをチェックするとあなたはNHibernateのは、あなたのParentObject含めて、DBからのすべての派生クラスを取得していることがわかります。これにより、複数のSelect文が生成されます。

ParentObjectを抽象クラスに変更してそのクラスを派生させると、この現象を防ぐことができます。次に、派生クラスをチェックすると、結果が得られます。

+0

あなたが書いている彼のデザインは、固定する必要があるかもしれませんが、バグがあまりにもNHibernateのでありますように見えます。 NHibernateは、クエリによってカバーされるすべてのエンティティクラスの結果を集約するのではなく、最初の照会されたエンティティクラス(アルファベット順にクラス名でソートされた)の結果のみをAny Anyの場合で返すようです。 –

関連する問題