0

私は EF4 を使用する 2 つのメソッドを持っています。Book のプロパティの 1 つに FirstPage があります。これは、アイテムの最初のリストのアイテムです。このインスタンス化されたオブジェクトに FirstPage プロパティを設定しようとすると、例外が発生します。

2 つのオブジェクトが異なる ObjectContext オブジェクトに関連付けられているため、2 つのオブジェクト間の関係を定義できません。

これは、オブジェクトがデタッチされる前に using ブロックが破棄されたためだと思います。1)コンテキストが破棄された後にデタッチするか、2)データレイヤーに戻すまでゴーストコンテキストにアタッチする方法はありますか?

これは私のコードです:

IEnumerable<Page> allPages = null;

using (var db = new DataContainer())
{
    var items = db.Pages;
    var filteredCode = items.Where(i => i.Code == PageCode);
    allPages = filteredCode.ToList();
}

Page page = allPages.FirstOrDefault(p => ...); // query omitted

var book = new Book()
{
    Title = @"asdas",
    FirstPage = page, // 'page' is never null
    // rest omitted
};
4

1 に答える 1

2

両方の質問への答えは次のとおりです。いいえ。両方の操作に同じコンテキストを使用するか、using ブロックのスコープを離れる前にエンティティを切り離してください。

POCO を使用している場合は、プロキシの作成をオフにすることもできます (= 遅延読み込みと動的な変更の追跡はありません)。プロキシはコンテキストへの参照を保持するため、POCO 自体はコンテキストについて何も知りません。

ところで。エンティティをデタッチしないことの別の副作用があります (プロキシされた POCO およびおそらくもEntityObject) コンテキストの有効期間の範囲外になる前に - エンティティがコンテキストへの参照を保持し、コンテキストが他の添付されたオブジェクトを含む他の多くのオブジェクトへの参照を保持するため、メモリリークが発生しますエンティティ。エンティティが解放される (エンティティへの参照がない) まで、ガベージ コレクターはコンテキストとすべての関連オブジェクトを解放できません。

于 2012-07-11T13:53:46.757 に答える