Poco的虚拟方法(非常简单的情况)内的NHibernate奇怪行为



我正在编码一个非常简单的情况,其中有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的博客文章

最新更新