我正在编码一个非常简单的情况,其中有2个类:父母和孩子。父母有n个孩子,孩子有1个父母。我之间建立了双向关系。
我正试图向父母添加一条业务规则,该规则检查了孩子的父母与处理呼叫的实例之间的平等。当应该返回真实时,它返回了错误。因此,我简化了一切,以达到问题的根源。因此,我测试了POCO之外的相同平等,它返回了:
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);
}
...
我将父实例直接传递给自身,并验证它是同一实例。好吧,这不是,当我输入ISREADMETHOD时,我会得到另一个实例。
这是我的测试结果:
外部父母:true
在致电ISRECATED之前的父实例数:1
内部父母:false
这应该等于sameAsthis:false
呼叫ISRECTAIN后的父实例数:2
我在做什么错?
有关详细的映射文件和pocos,请参见(http://stackoverflow.com/questions/13253459/relationships-fixup-in-entityframework-framework-vs-vs-nhibernate)
这是因为Nhibernate用于懒负载实体的代理。在您的情况下,孩子的父母是代理实例。
要解决问题,只需将
.Load
更改为.Get
.load
实际上并未击中数据库并填充实体。有关更多信息,请参见Ayende的博客文章