Ich habe kürzlich mit Entity Framework 4 gearbeitet und bin etwas verwirrt darüber, wann ObjectSet.Attach und ObjectSet.AddObject verwendet werden sollen .
Meinem Verständnis nach:
- Verwenden Sie "Anhängen", wenn bereits eine Entität im System vorhanden ist
- Verwenden Sie "AddObject", wenn Sie eine brandneue Entität erstellen
Wenn ich also eine neue Person erstelle , mache ich das.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Wenn ich eine vorhandene Person ändere , mache ich Folgendes :
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Denken Sie daran, dies ist ein sehr einfaches Beispiel. In Wirklichkeit verwende ich Pure POCOs (keine Codegenerierung), Repository-Muster (nicht mit ctx.Persons) und Unit of Work (nicht mit ctx.SaveChanges). Aber "under the cover" ist das Obige, was in meiner Implementierung passiert.
Nun meine Frage - ich muss noch ein Szenario finden, in dem ich Attach verwenden musste .
Was fehlt mir hier? Wann müssen wir Attach verwenden?
BEARBEITEN
Zur Verdeutlichung suche ich nach Beispielen, wann Attach over AddObject verwendet werden soll (oder umgekehrt).
BEARBEITEN 2
Die folgende Antwort ist richtig (was ich akzeptiert habe), aber ich dachte, ich würde ein weiteres Beispiel hinzufügen, bei dem Anhängen nützlich wäre.
In meinem obigen Beispiel zum Ändern einer vorhandenen Person werden tatsächlich zwei Abfragen ausgeführt.
Eine zum Abrufen der Person (.SingleOrDefault) und eine zum Ausführen des UPDATE (.SaveChanges).
Wenn ich (aus irgendeinem Grund) bereits wusste, dass "Joe Bloggs" im System vorhanden ist, warum eine zusätzliche Abfrage durchführen, um ihn zuerst zu erhalten? Ich könnte das tun:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Dies führt dazu, dass nur eine UPDATE-Anweisung ausgeführt wird.