2012-03-17 196 views
0

这是我在我的控制器代码: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。

+0

有就是更新您的实体 – 2012-03-17 09:39:01

回答

2

您正在更新没有附加到上下文的文章,因此不会保存任何内容。 也许你的意图是改变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"); 
     } 
    } 
+0

您好,感谢很多的任何代码。实际上,来自视图的文章也带有更新的值。我在服务器上设置日期,因为它们不会被用户以任何方式编辑。什么是以某种方式附加实体的最佳方式?或者我只需要复制文章参数中的值? – Unknown 2012-03-17 10:45:53

+0

this.context.ArticleSet.Attach(article); this.context.Entry(article).State = EntityState.Modified; this.context.SaveChanges(); – 2012-03-17 11:24:30

+0

有点超前你:)。我无法分离旧实体,所以当我尝试附加新实体时,它只会抛出臭名昭着的错误,即具有相同密钥的对象已经存在。我试图通过ID分离旧的实体,像这样:'this.context.Entry(this.GetSingle(id))。State = EntityState.Detached;' – Unknown 2012-03-17 11:35:08