私は NHibernate 3.3.1 を使用していますが、非常に興味深い問題が見つかりました。私のドメイン モデルでは、互いに参照する Carriage と CarriageRequest という 2 つのクラスを定義しました。遅延読み込みがオンになっているため、carriage.CarriageRequest にアクセスすると、プロキシ オブジェクトがポイントされます。それは大丈夫です。しかし、CarriageRequest クラスで定義されたメソッドを呼び出すと、'this' は 3 番目のオブジェクト インスタンスを参照します。
例:
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();
このコードはプロキシされたオブジェクト内で実行されるため、「sh.CarriageRequest == this」は常に false であるため、「shipment」は常に null です。sh.CarriageRequest はプロキシであり、これはラップされた元のインスタンスであるためです。