NHibernate POCO内部的奇怪行为';s虚拟方法(非常简单的案例)

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和Child。父项有n个子项,子项有1个父项。我在他们之间建立了双向关系

我试图向父级添加业务规则,该规则检查子级的父级和处理调用的实例之间是否相等。当它应该返回true时,它返回false。因此,我简化了一切,以找到问题的根源。因此,我在POCO之外测试了相同的等式,结果为真:

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);

}
...