这是我在控制器中的代码:
[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
感谢Vitaliy我现在知道附件是关键,但是当我尝试附加新实体时,我得到同样丑陋的异常
具有相同键的对象......
更新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();
}
我会想到一个更好的方法来传递ID,因为它已经是实体的一部分,可能带有接口“myInterface”,其中包含ID属性,T的类型为“myInterface”。
非常感谢Vitaliy。
答案 0 :(得分:2)
您正在更新未附加到Context的文章,因此不会保存任何内容。 可能你打算改变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");
}
}