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