Все примеры, которые я нашел, относятся к классу с именем 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, мне не пришло в голову, что присоединение уже присоединенного объекта очистит предыдущее состояние. Это причинило мне много боли. Но я хотел использовать шаблон Repository очень общим способом, который не заботился о том, был ли объект уже присоединен или был заново создан в результате привязки 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
. Если объект уже подключен, вы извлечете выгоду из предыдущего состояния объекта, что, в свою очередь, позволит оптимизировать обновление БД. Однако, если объект не был прикреплен, метод заставляет все это стать грязным.
Кажется очевидным сейчас, не раньше. Надеюсь, это кому-нибудь поможет.
Rich