Сначала я программирую веб-приложение MVC 4, используя базу данных EF 5. У меня есть несколько, казалось бы, тривиальных проблем, для которых я не могу найти правильного решения. Эти проблемы связаны с менеджером состояния объекта.
В самом простом сценарии все работает нормально: я читаю сущности из базы данных с помощью Find, помещаю их в представление, жду ответа, воссоздаю сущность, записываю ее обратно с помощью Attach, EntityState.Modified и SaveChanges. Проблемы возникают, если при обработке запроса я еще раз получаю сущность из базы данных.
Я делаю это, если:
1. По какой-то причине я хочу проверить некоторые значения исходной сущности.
2. Некоторые из моих значений не нужно изменять, поскольку они идентифицируют сущность. Я поместил их в свое представление только для справки, используя DisplayFor. Конечно, восстановленная модель не имеет этих значений. Я получаю исходный объект из базы данных и в контроллере использую TryUpdateModel, чтобы объединить его с моделью из представления.
При вызове Attach я получаю исключение «Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом».
Если я использую Context.Entry(t).CurrentValues.SetValues(t);
вместо DbSet.Attach(t);
, я получаю следующее исключение:
Member 'CurrentValues' cannot be called for the entity of type 'Price' because the entity does not exist in the context. To add an entity to the context call the Add or Attach method of DbSet<Price>.
Насколько я понимаю, есть два экземпляра объекта с определенным ключом. Я хотел бы сделать тот, который я хочу сохранить, заменить существующий, если вообще. Я хотел бы, чтобы это было автоматически, то есть мне не нужно было бы сообщать, присутствует ли уже другой, который должен быть заменен.
Есть ли способ добиться этого?