NHibernate,代理和平等

时间:2013-11-11 08:23:40

标签: c# nhibernate

我正在使用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'始终为null,因为'sh.CarriageRequest == this'始终为false。因为sh.CarriageRequest是一个代理,这是一个包装的原始实例。

1 个答案:

答案 0 :(得分:1)

好的,NHibernate保证同一会话中加载对象的引用相等。如果使用延迟加载,它会使用代理包装真实对象,并且代理上的每个方法调用都会转发到包装对象。因此,在这个对象内,每个参考比较&#39;这个&#39;从会话加载的同一个对象将失败(因为它将是一个不同的代理对象)。

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