He estado trabajando recientemente con Entity Framework 4, y estoy un poco confundido sobre cuándo usar ObjectSet.Attach y ObjectSet.AddObject.Entity Framework 4 - AddObject vs Attach
Desde mi entendimiento:
- Uso "Adjuntar" cuando una entidad ya existe en el sistema
- Uso "AddObject" al crear una marca nueva Entidad
lo tanto, si i' m creando una nueva Persona, hago esto.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
si estoy modificación de una persona existente, hago esto:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
tener en cuenta, este es un ejemplo muy simple. En realidad estoy usando Pure POCO (sin generación de código), el patrón Repository (no se ocupan de ctx.Persons), y la Unidad de trabajo (no se ocupan de ctx.SaveChanges). Pero "debajo de las sábanas", lo anterior es lo que sucede en mi implementación.
Ahora, mi pregunta - Todavía tengo que encontrar un escenario en el que he tenido que usar Acople.
¿Qué es lo que falta aquí? ¿Cuándo necesitamos usar Adjuntar?
EDITAR
Solo para aclarar, estoy buscando ejemplos de cuándo utilizar Adjuntar sobre AddObject (o viceversa).
EDIT 2
La respuesta a continuación es correcta (que acepté), pero que me gustaría añadir otro ejemplo donde Adjuntar sería útil.
En mi ejemplo anterior para modificando una Persona existente, se están ejecutando dos consultas.
Uno para recuperar la Persona (.SingleOrDefault), y otro para realizar la ACTUALIZACIÓN (.SaveChanges).
Si (por alguna razón), ya sabía que "Joe Bloggs" existía en el sistema, ¿por qué hacer una consulta adicional para obtenerlo primero? Podría hacer esto:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Esto dará como resultado que solo se ejecute una instrucción UPDATE.
Attach también se usa en MVC ahora en días cuando se vuelven a poner modelos directamente en EF. Funciona bastante bien y ahorra un montón de líneas de código. – ppumkin