2013-08-26 4 views
0

Необходимо сравнить исходное значение с текущим значением, чтобы сделать некоторые обновления объектов перед сохранением изменений. Как получить исходное значение объекта? Не работает:Как проверить исходное значение атрибута с помощью MVC и EF

public ActionResult Edit(int id = 0) 
{ 
    Project project = db.Projects.Find(id); 
    ... 
    db.Projects.Attach(project); // ATTACH here 
    ... 
} 

[HttpPost] 
public ActionResult Edit(Project project) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(project).State = EntityState.Modified; // The STATE was DETACHED here... 
     ... 
    } 

Это вопрос конфигурации, или я что-то пропустил? Заранее благодарю за любую помощь!

+0

Вы называете 'db.SaveChanges()'? – Aron

+0

В конце я вызываю SaveChanged, но у меня есть некоторые массовые обновления (Entityframework Extensions). – Gerard

ответ

1

Проблема с вашим решением - это срок службы контроллера. By default a new instance of the controller is generated for each client request. Это означает, что вам нужно загрузить исходное значение внутри метода POST редактирования, потому что вы не можете использовать экземпляр вашего контекста.

я редактировал образец кода после того, как @ комментарий Джерарда

[HttpPost] 
public ActionResult Edit(Project project) 
{ 
    if (ModelState.IsValid) 
    { 
     var original_value = db.Projects.Find(project.ProjectId); 
     or 
     var original_value_detached = db.Projects.AsNoTracking().Where(P => P.ProjectId == project.ProjectId).FirstOrDefault(); 
    } 
} 

Или написать собственную реализация контроллера завода делиться вам контекстом между двумя запросами, но вы должны рассматривать запросы разные клиентов. Вы можете найти пример here

+0

Спасибо, ты прав, конечно! Вернуться к AsNoTracking в моем случае. Код типа db.Projects.AsNoTracking(). Где (P => P.ProjectId == prj.ProjectId) .FirstOrDefault(); работает отлично. Думал, что первоначальное значение было легко доступно. – Gerard

+0

Отлично! Я обманул свой ответ. Теперь он содержит оба решения: прикрепленные и отсоединенные – boindiil

0

Похоже, вы реализуете параллелизм. Может быть, вы можете попытаться поймать свои изменения, используя DbUpdateConcurrencyException. Что-то вроде этого:

try 
     { 
      ... 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException ex) 
     { 
      var entry = ex.Entries.Single(); 
      var dbValue = (Project)entry.GetDatabaseValues().ToObject(); 
      if(dbValue.State == EntityState.Modified) 
      { 
      //***your code 
      } 
     } 
Смежные вопросы