1

親を指す子エンティティの現在の永続フレームワークプロパティでは、常に同じインスタンスを指します。たとえば、次のエンティティクラスがあるとします

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オブジェクトの新しいインスタンスを読み込むのでしょうか。

4

4 に答える 4

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

常に正しいとは限らないかもしれませんが、怠惰なものとして設定した場合は、nihibernateマッピングで多対1の側面をどのように設定したかによって異なります(以下のように)

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

その場合、referenceequalsはtrueを返しません。

ただし、前の行で前述したのと同じセッションで最初の順序を取得すると、プロキシではなく実際のオブジェクトを取得する可能性があります

于 2009-06-12T19:31:48.530 に答える
2

NHibernate は、単一のセッション (Unit Of Work) 内でこのように動作します。NHibernate のセカンド レベル キャッシュを使用して、単一のセッションを超えてこのように機能させる方法があります。これについてのすばらしい説明は、NHibernate の First And Second Level Cachingにあります。

于 2009-06-12T19:12:33.037 に答える
1

はい。それらは同じインスタンスを参照しています! LINQ to SQL および Entity Framework についても同様です。

于 2009-06-12T19:12:52.600 に答える