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方法或按主键进行比较. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |