Это код, который у меня есть в моем контроллере:
[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.
Большое спасибо Виталию.