作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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”始终为空,因为“sh.CarriageRequest == this”始终为 false。因为 sh.CarriageRequest 是一个代理,而且这是一个包装好的原始实例。
最佳答案
好的,NHibernate 保证同一 session 中加载对象的引用相等性。如果使用延迟加载,它会用代理包装真实对象,并且代理上的每个方法调用都会转发到包装的对象。因此,在此对象内部,“this”与从 session 加载的同一对象之间的每个引用比较都将失败(因为它将是不同的代理对象)。
因此,解决此问题的唯一方法是使用 Equals 方法或通过主键进行比较。
关于c# - NHibernate、代理和平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19901778/
我是一名优秀的程序员,十分优秀!