Entity Framework Code Firstでオブジェクトをデタッチするにはどうすればよいですか?


回答:


156

既存のオブジェクトを切り離したい場合は、@ Slaumaのアドバイスに従ってください。変更を追跡せずにオブジェクトをロードする場合は、以下を使用します。

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

コメントで述べたように、これはエンティティを完全に切り離しません。それらはまだ接続されており、遅延読み込みは機能しますが、エンティティは追跡されません。これは、エンティティをロードしてデータを読み取るだけで、それらを変更する予定がない場合などに使用します。


3
@Ladislav:これは確かにおそらく笑コーダーが意味したものです。私はこの方法を使用したり考えたりしたことがありませんが、オブジェクトリストを読み込んでコンテキストを一度に破棄することがよくありますusing(ctx){ return ctx....ToList(); }。このような場合AsNoTracking()、オブジェクトコンテキストを不必要に埋める手間を省くことができるので、使用することには意味があります。特に大きなリストの場合、おそらくパフォーマンスとメモリ消費のメリットがあると思いますよね?
スラウマ

1
@Slauma:はい、パフォーマンス上の利点があります。これが実際にこの方法が存在する理由です。ObjectContext APIでこのアプローチを使用することは、もう少し複雑です。
Ladislav Mrnka、2011

2
これは遅延読み込みを無効にしますか?
Shawn Mclean

3
実際、これは遅延読み込みを無効にせず、変更の追跡を無効にしてパフォーマンスを向上させるだけです=エンティティはまだアタッチされています。この質問に答えた後で見つけたので、@ Slaumaの質問を有効な回答としてマークする必要があります。
Ladislav Mrnka、2011

1
これが私が欲しいものです。遅延読み込みと、分離されたエンティティのみを変更する機能が必要です。
Shawn Mclean

255

これはオプションです:

dbContext.Entry(entity).State = EntityState.Detached;

3
IQueryableを返すオブジェクトを取得するときにこれを実行できますか?
Shawn Mclean

1
@lolコーダー:私があなたを正しく理解しているかどうかはわかりentityませんが、モデルクラス(Person、Customer、Orderなど)の一部である型の実体化されたオブジェクトである必要があります。IQueryable <T>をに直接渡すことはできませんdbContext.Entry(...)。それがあなたが意図した質問ですか?
スラウマ

9
@EladBenda:場合によります。コンテキストにすでにアタッチされているオブジェクトをデタッチする場合は、状態をに設定しDetachedます。エンティティをコンテキストにアタッチせずに(変更追跡なしで)DBからエンティティをロードする場合は、を使用しますAsNoTracking
Slauma 2013

1
この方法で興味深い問題が見つかりました。エンティティがプロキシクラスである場合でも、状態をに変更した後は遅延読み込みは機能しませんDetached
kjbartel 2014

4
@kjbartel:エンティティはコンテキストとリンクしていないため、これは予想される動作です。
Ricardo Souza
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.