4

私は 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 はプロキシであり、これはラップされた元のインスタンスであるためです。

4

1 に答える 1

1

さて、NHibernate は、同じセッション内でロードされたオブジェクトの参照の等価性を保証します。また、遅延読み込みを使用している場合は、実際のオブジェクトをプロキシでラップし、プロキシでのすべてのメソッド呼び出しがラップされたオブジェクトに転送されます。そのため、このオブジェクト内では、'this' と、セッションからロードされた同じオブジェクトとの間のすべての参照比較が失敗します (別のプロキシ オブジェクトになるため)。

したがって、この問題を解決する唯一の方法は、Equals メソッドを使用するか、主キーで比較することです。

于 2013-11-15T09:19:36.490 に答える