Недавно я работал с Entity Framework 4 и немного смущен, когда следует использовать ObjectSet.Attach и ObjectSet.AddObject.
Из моего понимания:
- Используйте "Прикрепить", когда объект уже существует в системе
- Используйте "AddObject" при создании нового Entity
Итак, если я создаю новый 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) и Unit of Work (не занимайтесь ctx.SaveChanges). Но "под обложками", это то, что происходит в моей реализации.
Теперь, мой вопрос - мне еще предстоит найти сценарий, в котором мне пришлось использовать Прикрепить.
Что мне здесь не хватает? Когда нам нужно использовать Attach?
ИЗМЕНИТЬ
Чтобы уточнить, я ищу примеры того, когда использовать Attach над AddObject (или наоборот).
РЕДАКТИРОВАТЬ 2
Ниже приведен правильный ответ (который я принял), но я подумал, что добавлю еще один пример, где Attach был бы полезен.
В приведенном выше примере для изменения существующего Person выполняются два запроса.
Один для извлечения Person (.SingleOrDefault), а другой для выполнения UPDATE (.SaveChanges).
Если (по какой-то причине), я уже знал, что в системе существует "Joe Bloggs", зачем нужен дополнительный запрос, чтобы получить его первым? Я мог бы сделать это:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Это приведет к выполнению только инструкции UPDATE.