微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐