2009-06-12 10 views
1

現在の永続性フレームワークのプロパティは、その親を指している子エンティティのプロパティが常に同じインスタンスを指しています。たとえば、以下のエンティティクラス永続性フレームワークの参照ID

public class Order 
{ 
    public int OrderId{get;set;} 
    public EntityCollection<LineItem> Items{get;} 
} 

public class LineItem 
{ 
    public Order Order{ get;set;} 
} 

与えられた私たちは、このようなデータベースから順序をロードすることができます。

var order = Order.FindById(1000); 

が今ここに以下は私たちの現在のフレームワークの

真実である私の質問への鍵です
object.ReferenceEquals(order, order.Items[ 0 ].Order); 

つまり、明細プロパティのOrderプロパティは、Itemsプロパティを使用してアクセスすると、メモリ内の注文オブジェクトのインスタンスとまったく同じインスタンスを指します。

私はエンティティツールを維持するのにちょっと飽き飽きし、NHibernateやその他の永続性フレームワークに切り替える必要があります。私の質問は、NHibernateの遅延ロード機能が同じ方法で動作するのか、それとも各ラインアイテムのOrderオブジェクトの新しいインスタンスをロードするのでしょうか?

答えて

2

NHibernateは、単一セッション(Unit Of Work)内でこのように動作します。 NHibernateの第2レベルのキャッシュを使用することによって、単一セッションを超えてこのように動作させる方法があります。これの大きな説明はここにあります。First And Second Level Caching In NHibernate

1

はい。彼らは同じインスタンスを参照しています! LINQ to SQLとEntity Frameworkでも同じです。

0

はい、NHibernateは、エンティティ参照を管理するためにISession内でIdentity Mapを使用します。他のパテントフレームワークも同じことをします(または行う必要があります)。

2
object.ReferenceEquals(order,order.Items[ 0 ].Order); 

常に真ではないかもしれないが、それはあなたがそれを設定している場合、nihibernateマッピングにおける多対一側の設定方法に依存して、その後

<many-to-one name="order" lazy="proxy" /> 

(以下同様)として怠惰参照はtrueを返しません。

しかし、あなたが述べたように、あなたは前の行に同じセッションにintial順序を取得する場合、あなた

代理ではない実際のオブジェクトを取得する可能性があります
関連する問題