Подтвердить что ты не робот

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

Кажется очевидным сейчас, не было раньше. Надеюсь, это поможет кому-то.

Рич

4b9b3361

Ответ 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;
}