EF实体未在数据库中更新

时间:2012-03-17 09:30:36

标签: entity-framework

这是我在控制器中的代码:

   [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。

1 个答案:

答案 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"); 
       } 
   }