4

我正在使用 NHibernate 3.3.1 并发现非常有趣的问题。在我的领域模型中,我定义了两个类:Carriage 和 CarriageRequest,它们相互引用。因为打开了延迟加载,所以当我访问carriage.CarriageRequest - 它指向一个代理对象。好的,可以。但是当我调用任何在 CarriageRequest 类中定义的方法时,“this”引用了第三个对象实例。

例子:

class CarriageRequest
{
  public virtual void Test(CarriageRequest instance)
  {
    Debug.WriteLine(Object.ReferenceEquals(this, instance)); // prints FALSE
  }
}

class Carriage
{ 
  public virtual CarriageRequest CarriageRequest { get; set; }
}

...
var carriage = session.Get<Carriage>(123);
carriage.CarriageRequest.Test(carriage.CarriageRequest);

所以看起来 NHibernate 代理包装了原始对象并将所有方法调用转发到包装的对象。在这种情况下如何使用“==”?我需要做这样的事情:

var shipment = (from sh in Carriage.Shipments where sh.CarriageRequest == this & sh.Warehouse == waybill.Warehouse select sh).FirstOrDefault();

此代码代理对象内执行,因此“shipment”始终为空,因为“sh.CarriageRequest == this”始终为 false。因为 sh.CarriageRequest 是一个代理,这是一个包装的原始实例。

4

1 回答 1

1

好的,NHibernate 保证在同一个会话中加载对象的引用相等。如果使用延迟加载,它会使用代理包装真实对象,并且代理上的每个方法调用都会转发到被包装的对象。因此,在此对象内部,“this”与从会话加载的同一对象之间的每个引用比较都将失败(因为它将是不同的代理对象)。

因此,解决此问题的唯一方法是使用 Equals 方法或按主键进行比较。

于 2013-11-15T09:19:36.490 回答