加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – NHibernate,代理和平等

发布时间:2020-12-15 21:58:37 所属栏目:百科 来源:网络整理
导读:我正在使用NHibernate 3.3.1并发现了非常有趣的问题. 在我的域模型中,我定义了两个类:Carriage和CarriageRequest,互相引用.因为延迟加载是打开的,所以当我访问carriage.CarriageRequest时 – 它指向一个代理对象.好的,可以.但是当我调用CarriageRequest类中
我正在使用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方法或按主键进行比较.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读