1

我正在用 2 个类编写一个非常简单的案例:Parent 和 Child。父母有 n 个孩子,孩子有 1 个父母。我在它们之间建立了双向关系。

我试图向我的父母添加一个业务规则,该规则检查孩子的父母和处理呼叫的实例之间的相等性。当它应该返回真时它返回假。所以我简化了一切以找到问题的根源。所以我在 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;            
}
...

它返回假......我只是不明白。这是完全相同的代码。

更多信息:

所以为了获得更多信息,我修改了我的测试:

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 时,我创建了另一个实例。

这是我的测试结果:

外部父母:真

调用 IsRelated:1 之前的父实例数

内部父母:假

这应该等于 sameAsThis:False

调用 IsRelated 后的父实例数:2

我究竟做错了什么 ?

有关详细的映射文件和 pocos,请参阅(http://stackoverflow.com/questions/13253459/relationships-fixup-in-entityframework-vs-nhibernate)

4

1 回答 1

2

这是因为 Nhibernate 使用代理来延迟加载实体。在您的情况下,孩子的父母是代理实例。

要解决您的问题,只需更改.Load.Get

.load实际上并没有命中数据库并填充实体。有关更多信息,请参阅 Ayende 的这篇博文

于 2012-11-07T18:47:50.307 回答