私は最近Entity Framework 4を使用していて、ObjectSet.AttachとObjectSet.AddObjectをいつ使用するかについて少し混乱しています。
私の理解から:
- エンティティがシステムにすでに存在する場合は、「アタッチ」を使用します
- 新しいエンティティを作成するときに「AddObject」を使用します
したがって、新しいPersonを作成する場合は、これを行います。
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
既存のPersonを変更する場合は、次のようにします。
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
これは非常に簡単な例です。実際には、Pure POCO(コード生成なし)、リポジトリパターン(ctx.Personsを扱わない)、および作業単位(ctx.SaveChangesを扱わない)を使用しています。しかし、「カバーの下」では、上記は私の実装で何が起こるかです。
さて、私の質問 -私はAttachを使用しなければならなかったシナリオをまだ見つけていません。
ここで何が欠けていますか?いつAttachを使用する必要がありますか?
編集
わかりやすくするために、AddObjectに対してAttachを使用する(またはその逆の)場合の例を探しています。
編集2
以下の答えは正しいです(私はこれを受け入れました)が、アタッチが役立つ別の例を追加したいと思いました。
上記の既存のPersonを変更する例では、2つのクエリが実際に実行されています。
1つはPerson(.SingleOrDefault)を取得し、もう1つはUPDATE(.SaveChanges)を実行します。
(何らかの理由で)システムに「Joe Bloggs」が存在することをすでに知っている場合、なぜ彼を最初に取得するために追加のクエリを実行するのですか?私はこれを行うことができます:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
これにより、UPDATEステートメントのみが実行されます。