Entity framework 数据库中未更新EF实体

Entity framework 数据库中未更新EF实体,entity-framework,Entity Framework,这是我控制器中的代码: [HttpPost] public ActionResult UpdateArticle(Article article) { if (ModelState.IsValid) { article.DateAdded = this.articleRepository.GetSingle(article.ID).DateAdded; article.Dat

这是我控制器中的代码:

   [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();
}
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"); 
       } 
   } 
如果我取消注释第一行

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。

您正在更新文章,该文章未附加到上下文,因此不会保存任何内容。 可能您的目的是更改DateModified,然后您应该这样做:

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

    this.context.SaveChanges();
}
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"); 
       } 
   } 

有任何代码可以更新您的实体嗨,非常感谢。实际上,视图中的文章也带有更新的值。我在服务器上设置日期,因为用户不打算以任何方式编辑这些日期。以某种方式连接实体的最佳方式是什么?或者我只需要复制article参数的值?this.context.ArticleSet.Attach(article);this.context.Entry(article.State=EntityState.Modified;this.context.SaveChanges();在你前面一点:)。我无法分离旧实体,因此当我尝试附加新实体时,它只会抛出一个臭名昭著的错误,即具有相同键的对象已经存在。我正试图通过id分离旧实体,如下所示:
this.context.Entry(this.GetSingle(id)).State=EntityState.Detached