这是我在我的控制器代码:EF实体不会更新数据库
[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无法使用相同的密钥跟踪多个 对象。
异常被抛出。当评论没有保存。
任何帮助表示赞赏。
UPDATE
好这个问题似乎是,更新的文章是不是上下文的“一部分”,所以当我把它传递给更新没有任何反应。如果我从存储库本身获取实体并传递新值并在此之后传递此实体,则所有事情都按预期工作。这段代码实际更新资源库中的日期:
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();
}
我会想到一个更好的方式来传递的ID,因为它已经是一部分该实体可能带有和接口“myInterface”,它具有ID属性,而T将是类型“myInterface”。
非常感谢Vitaliy。
有就是更新您的实体 – 2012-03-17 09:39:01