NHibernate POCO内部的奇怪行为';s虚拟方法(非常简单的案例)
我用两个类编写了一个非常简单的案例:Parent和Child。父项有n个子项,子项有1个父项。我在他们之间建立了双向关系 我试图向父级添加业务规则,该规则检查子级的父级和处理调用的实例之间是否相等。当它应该返回true时,它返回false。因此,我简化了一切,以找到问题的根源。因此,我在POCO之外测试了相同的等式,结果为真:NHibernate POCO内部的奇怪行为';s虚拟方法(非常简单的案例),nhibernate,orm,Nhibernate,Orm,我用两个类编写了一个非常简单的案例:Parent和Child。父项有n个子项,子项有1个父项。我在他们之间建立了双向关系 我试图向父级添加业务规则,该规则检查子级的父级和处理调用的实例之间是否相等。当它应该返回true时,它返回false。因此,我简化了一切,以找到问题的根源。因此,我在POCO之外测试了相同的等式,结果为真: Parent parent0 = session.Load<Parent>(0); Child child = session.Load<Child&g
Parent parent0 = session.Load<Parent>(0);
Child child = session.Load<Child>(0);
bool externalTest = parent0 == child.Parent;
它返回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);
}
...
Parent parent0=session.Load(0);
Child=session.Load(0);
bool externalTest=parent0==child.Parent;
System.Diagnostics.Debug.WriteLine(“外部父项:+externalTest”);
System.Diagnostics.Debug.WriteLine(“调用IsRelated之前的父实例数:“+parent.NumberOfInstances”);
父母0.i相关(子女,父母0);
System.Diagnostics.Debug.WriteLine(“调用IsRelated后的父实例数:“+parent.NumberOfInstances”);
... 父类代码
公共虚拟无效相关(子-子、父-同-此)
{
bool internalTest=child.Parent==this;
System.Diagnostics.Debug.WriteLine(“内部父级:+internalTest”);
bool sameTest=sameAsThis==this;
System.Diagnostics.Debug.WriteLine(“这应该等于sameAsThis:+sameTest”);
}
...
我将父实例直接传递给它自己,并验证它是同一个实例。事实并非如此,我在输入IsRelatedMethod时创建了另一个实例
以下是我的测试结果:
外部家长:正确
调用IsRelated之前的父实例数:1
内部父级:False
这应该等于这个:错
调用IsRelated后的父实例数:2
我做错了什么
有关映射文件和POCO的详细信息,请参阅(http://stackoverflow.com/questions/13253459/relationships-fixup-in-entityframework-vs-nhibernate)这是因为Nhibernate使用代理延迟加载实体。在您的情况下,子对象的父对象是代理实例 要解决您的问题,只需将
.Load
更改为.Get
.load
实际上不会命中数据库并填充实体。更多信息请参见Ayende的文章这是代理吗?孩子的父对象是代理实例吗?如果将.Load
更改为.Get
,会发生什么?是的,这完全起到了作用。我真的认为Load是正确的调用方法。在回答中发表您的评论,我会将其标记为正确答案。谢谢里波:)
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);
}
...