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