Force EF 4.1 Code Сначала, чтобы увидеть прикрепленный объект как измененный
Все примеры, которые я нашел, относятся к классу ObjectContext, который, как представляется, не существует в CTP5. Я должен подчеркнуть, что CTP5 - это мое первое знакомство с Entity Framework.
У меня отключен POCO, который я привязал к своему DbContext. SaveChanges не получает изменения, хотя, как я рассказываю, что мой контекст обновляет этот объект?
_context.Users.Attach(user);
// The user has been replaced.
_context.SaveChanges();
// The change is not saved.
Что я делаю неправильно?
Обновление 12/01/2011
Возможно, это будет очевидно для большинства, но как первый пользователь EF, мне не пришло в голову, что прикрепление объекта, который уже был прикреплен, очистит предыдущее состояние. Это вызвало у меня большую боль. Но я хотел использовать шаблон репозитория очень универсальным способом, который не заботился о том, был ли объект уже прикреплен или был недавно создан в результате привязки ASP.NET MVC. Поэтому мне нужен метод UpdateUser
, и я добавил его ниже.
public User UpdateUser(User user) {
if (_context.Entry(user).State == EntityState.Detached) {
_context.Users.Attach(user);
_context.Entry(user).State = EntityState.Modified;
}
return user;
}
Метод, очевидно, предполагает, что объект существует в хранилище данных в некотором роде, он называется UpdateUser
в конце концов. Если объект уже подключен, вы получите преимущество от предыдущего состояния объекта, что, в свою очередь, позволит оптимизировать обновление БД. Однако, если объект не был прикреплен, метод заставляет все это стать грязным.
Кажется очевидным сейчас, не было раньше. Надеюсь, это поможет кому-то.
Рич
Ответы
Ответ 1
Когда вы прикрепляете объект, он переходит в состояние без изменений (он не был изменен с момента привязки к контексту). Все, что вам нужно - это явно изменить состояние Entity для Modified:
_context.Users.Attach(user);
_context.Entry(user).State = System.Data.Entity.EntityState.Modified;
_context.SaveChanges();
Ответ 2
Для полноты вы можете получить доступ к объекту ObjectContext, переведя DbContext в IObjectContextAdapter:
((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.ChangeObjectState(user, EntityState.Modified);
Метод Мортезы намного более чист, и получает мой голос.
Ответ 3
Я считаю, что вам не нужно прикреплять сущность до того, как вы изменили свой вызов. просто настройка на изменение выполнит задание.
if (_context.Entry(user).State == EntityState.Detached)
{
_context.Entry(user).State = EntityState.Modified;
}