2012-03-17 195 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