Di recente ho lavorato con Entity Framework 4 e sono leggermente confuso su quando utilizzare ObjectSet.Attach e ObjectSet.AddObject .
Dalla mia comprensione:
- Utilizzare "Allega" quando un'entità esiste già nel sistema
- Utilizzare "AddObject" durante la creazione di una nuova entità
Quindi, se sto creando una nuova persona , lo faccio.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Se sto modificando una persona esistente , faccio questo:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Ricorda, questo è un esempio molto semplice . In realtà sto usando Pure POCO (nessuna generazione di codice), pattern di repository (non trattate con ctx.Persons) e Unit of Work (non trattate con ctx.SaveChanges). Ma "sotto le coperte", quanto sopra è ciò che accade nella mia implementazione.
Ora, la mia domanda - Devo ancora trovare uno scenario in cui ho dovuto usare Attach .
Cosa mi sto perdendo qui? Quando dobbiamo usare Attach?
MODIFICARE
Giusto per chiarire, sto cercando esempi su quando usare Attach over AddObject (o viceversa).
MODIFICA 2
La risposta di seguito è corretta (che ho accettato), ma ho pensato di aggiungere un altro esempio in cui Allegare sarebbe utile.
Nel mio esempio precedente per la modifica di una persona esistente , vengono effettivamente eseguite due query.
Uno per recuperare la persona (.SingleOrDefault) e un altro per eseguire l'AGGIORNAMENTO (.SaveChanges).
Se (per qualche ragione), sapevo già che "Joe Bloggs" esisteva nel sistema, perché fare una query aggiuntiva per farlo prima? Potrei farlo:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Ciò comporterà solo l'esecuzione di un'istruzione UPDATE.