2011-06-23 4 views

答えて

2

エンティティは、コンテキストが破棄されるとデタッチされます。以下の記事を参照してください:

Entity Framework Multiple Object Contexts

+1

http://stackoverflow.com/questions/2244843/entity-framework-detaching-entities-when-objectcontext-disposedデタッチする必要があると示唆していますか?それは正しいのですか? – glosrob

5

ありませんあなたは、エンティティに切り離す呼び出す必要はありません。あなたが何かを行う場合は、:

var people = Context.Person.Where(p => p.FirstName == "John"); 

をして、あなたのコンテキストを処分のIEnumerableが実行を延期したため、人々は、例外がスローされます。これを行う:

あなたの人リストを引き続き使用できます。文脈が配置された後、あなたが特定のエンティティではなく列挙をフェッチしたので

さらに、

var john = Context.Person.FirstOrDefault(p => p.Id == 342); 

は、動作します。

7

多分Detachの意味に依存します。添付されたエンティティは、コンテキストがエンティティについて知っていて、その変更を追跡することを意味します。コンテキストを破棄すると、それ以上変更を追跡できなくなり、エンティティは切り離されたようになります。ここでのような意味合いが本当にあります。

動的プロキシ(POCO - ダイナミックな変更の追跡またはレイジーローディング)を使用している場合、プロキシ自体はコンテキストに対して内部的に後方参照を保持しますが、コンテキストの廃棄には反応しません。それはまだ参照(btw。これはいくつかの厄介なメモリリークのソースになることができます)を保持します。これは、2つの状況で問題を起こす:

  • あなたはそれが(元のコンテキストがすでに死んでいるという事実にもかかわらず)エンティティは、単一のコンテキストによって追跡することができますいくつかの例外がスローされます別のコンテキストに、このようなエンティティを添付しようとします。
  • あなたが熱心にロードされていないナビゲーションプロパティにアクセスしようとすると、プロキシが廃棄されたコンテキストで遅延ロードを引き起こすため、ObjectDisposedExceptionが返されます。

これを回避する唯一の方法は、動的プロキシを無効にするか、コンテキストを破棄する前にエンティティを手動で切り離すことです。これにはもう1つの欠点があります。

関連する問題