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(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是一个代理,这是一个包装的原始实例。

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

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