EF Entity не обновляется в базе данных - PullRequest
0 голосов
/ 17 марта 2012

Это код, который у меня есть в моем контроллере:

   [HttpPost]
   public ActionResult UpdateArticle(Article article)
   {
       if (ModelState.IsValid)
       {
           article.DateAdded = 
               this.articleRepository.GetSingle(article.ID).DateAdded;
           article.DateModified = DateTime.Now;

           this.articleRepository.Update(article);
               return this.Redirect("~/Admin");
       }
       else
       {
           return this.Redirect("~/Admin/UnsuccessfulOperation");
       }
   }

В представлении данные обновляются.У меня есть общий репозиторий, который обрабатывает сохранение.Обновление выглядит следующим образом:

public virtual void Update(T entity)
{
    //this.context.Entry(entity).State = EntityState.Modified;

    this.context.SaveChanges();
}

Если я раскомментирую первую строку

Объект с таким же ключом уже существует в ObjectStateManager.ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.

Исключение выдается.Когда комментарий ничего не сохраняется.

Любая помощь приветствуется.

ОБНОВЛЕНИЕ

Хорошо, проблема в том, что обновленная статья не является "частью"контекста, поэтому, когда я передаю его в обновление, ничего не происходит.Если я получу сущность из самого хранилища и передам новые значения, и после этого передам эту сущность, все будет работать, как и ожидалось.Этот фрагмент кода фактически обновляет дату в хранилище:

var art = this.articleRepository.GetSingle(article.ID);
art.Text = article.Text;
this.articleRepository.Update(art);

Чего я не понимаю, так это то, что это работает:

var art = this.articleRepository.GetSingle(article.ID);
art.Text = article.Text;
this.articleRepository.Update(article);

ОБНОВЛЕНИЕ 2

Благодаря Виталию я теперь знаю, что присоединение является ключом, но когда я пытаюсь присоединить новую сущность, я получаю то же самое уродливое исключение

Объект с тем же ключом уже...

ОБНОВЛЕНИЕ 3

Поскольку я не могу ответить на свой вопрос менее чем за 8 часов, я полагаю, что мне нужно сделать еще одно обновление.

Хорошо, вот что я сделал для того, чтобы успешно отделить старую и присоединить новую сущность:

public virtual void Update(T entity, object id)
{
    this.context.Entry(this.GetSingle(id)).State = EntityState.Detached;
    this.context.Entry(entity).State = EntityState.Added;
    this.context.Entry(entity).State = EntityState.Modified;

    this.context.SaveChanges();
}

Я подумаю о лучшем способе передачи идентификатора, так как он ужечасть сущности, возможно, с интерфейсом myInterface, имеющим свойство ID, и T будет иметь тип myInterface.

Большое спасибо Виталию.

1 Ответ

2 голосов
/ 17 марта 2012

Вы обновляете статью, которая не привязана к контексту, поэтому ничего не будет сохранено.Возможно, вы намеревались изменить DateModified, тогда вы должны сделать это так:

public ActionResult UpdateArticle(Guid articleID) 
   { 
       if (ModelState.IsValid) 
       { 
           var article =  
               this.articleRepository.GetSingle(articleID); 
           article.DateModified = DateTime.Now; 

           this.articleRepository.Update(article); 
               return this.Redirect("~/Admin"); 
       } 
       else 
       { 
           return this.Redirect("~/Admin/UnsuccessfulOperation"); 
       } 
   } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...