親と子の 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) を参照してください。