1

親と子の 2 つのクラスを持つ非常に単純なケースをコーディングしていました。親には n 個の子があり、子には 1 つの親があります。それらの間に双方向の関係を設定しました。

親にビジネス ルールを追加しようとしていました。そのルールは、子の親と呼び出しを処理するインスタンスとの間の同等性をチェックしました。true を返す必要があるときに false を返しました。そこで、問題の根本にたどり着くためにすべてを単純化しました。そこで、POCO の外で同じ等価性をテストしたところ、true が返されました。

Parent parent0 = session.Load<Parent>(0);
Child child = session.Load<Child>(0);

bool externalTest = parent0 == child.Parent;

次に、親がまったく同じことをテストするためのメソッドをコーディングしました。

bool internalTest = parent0.IsRelated(child);

... Parent Class code

public virtual bool IsRelated(Child child)
{
    return child.Parent == this;            
}
...

そしてそれはfalseを返します...私はそれを理解していません。まったく同じコードです。

より詳しい情報:

したがって、より多くの情報を得るために、テストを変更しました。

Parent parent0 = session.Load<Parent>(0);
Child child = session.Load<Child>(0);

bool externalTest = parent0 == child.Parent;
System.Diagnostics.Debug.WriteLine("outside parent: " + externalTest);
System.Diagnostics.Debug.WriteLine("Number of parent instances before call to IsRelated:" + Parent.NumberOfInstances);
parent0.IsRelated(child, parent0);
System.Diagnostics.Debug.WriteLine("Number of parent instances after call to IsRelated:" + Parent.NumberOfInstances);

... Parent Class code
public virtual void IsRelated(Child child, Parent sameAsThis)
{
    bool internalTest = child.Parent == this;
    System.Diagnostics.Debug.WriteLine("inside parent:" + internalTest);

    bool sameTest = sameAsThis == this;
    System.Diagnostics.Debug.WriteLine("this should equal sameAsThis:" + sameTest);

}
...

親インスタンスをそれ自体に直接渡し、それが同じインスタンスであることを確認しました。そうではありません。IsRelatedMethod に入ると、別のインスタンスが作成されます。

ここに私のテスト結果があります:

外側の親: True

IsRelated:1 を呼び出す前の親インスタンスの数

内部の親:False

これは sameAsThis:False と等しくなければなりません

IsRelated:2 への呼び出し後の親インスタンスの数

私は何を間違っていますか?

詳細なマッピング ファイルと poco については、(http://stackoverflow.com/questions/13253459/relationships-fixup-in-entityframework-vs-nhibernate) を参照してください。

4

1 に答える 1

2

これは、エンティティを遅延ロードするために Nhibernate が使用するプロキシが原因です。あなたの場合、子の親はプロキシ インスタンスです。

問題を解決するには、単に変更.Loadします.Get

.load実際にデータベースにヒットしてエンティティにデータを入力するわけではありません。詳細については、Ayende によるこのブログ投稿を参照してください。

于 2012-11-07T18:47:50.307 に答える