2013-03-12 61 views
3

我想學習MVC & EF遠離WebForms和ADO.NET。我只是把我的第一個試驗場所放在一起,看看它是如何發展的,並且遇到了絆腳石。使用MVC4 +實體框架更新模型4

我正在編輯頁面上的記錄並按下save.I沒有返回錯誤,但數據未更新。

Article模型進行更新

public class Article 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Author { get; set; } 
    public string Title { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string Body { get; set; } 
    public int Likes { get; set; } 
    public int Dislikes { get; set; } 
    public List<Comment> Comments { get; set; } 
    public string Tags { get; set; } 
    public int Category { get; set; } 
} 

編輯代碼在控制器上,該條款ArticleID從查詢字符串。

[HttpPost] 
    public ActionResult Edit(int articleId, FormCollection collection) 
    { 
     var result = from i in db.Articles 
        where i.Id == articleId 
        select i; 

     if (TryUpdateModel(result)) 
     { 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(result.First()); 

    } 

在調試時,TryUpdateModel()返回true並調用db.SaveChanges。沒有錯誤返回。當被引導回Controller上的Index方法時,文章顯示不變。

這是顯而易見的事情嗎?

很多謝謝

+1

第一步是在調試器中驗證if數據塊中的對象是否實際上用新值更新。 – 2013-03-12 11:24:27

+0

我的理解是傳遞給TryUpdateModel的結果是您嘗試更新的記錄。該方法嘗試從發佈的數據創建模型,然後嘗試更新傳入的記錄。 FormCollection顯示正確的模型模式,但在調試時它不顯示值。 – James 2013-03-12 11:30:32

+0

就在我的頭頂,在調試過程中,檢查result實體是否已經被修改,並且正在被DbContext跟蹤。尋找'EntityState.Modified'。相關SO問題:http://stackoverflow.com/questions/7106211/entity-framework-why-explicitly-set-entity-state-to-modified – 2013-03-12 11:37:32

回答

0

我忘了從枚舉中選擇模型。添加.First()來選擇記錄修復它。只是其中一個我無法看到樹木的場合!

[HttpPost] 
    public ActionResult Edit(int articleId, FormCollection collection) 
    { 
     var result = from i in db.Articles 
        where i.Id == articleId 
        select i; 

     if (TryUpdateModel(result.First())) 
     { 

      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(result.First()); 

    } 
+2

我建議改變LINQ查詢有點清晰,就像'var result = db.Articles.Single(i => i.Id == articleId)''。如果選擇'Single ()',你不需要使用'First()'。 – Graham 2013-03-12 12:24:56

+0

完全同意。我有時候會犯一些更爲冗長的語法,有時候完全是因爲(壞)習慣。 – James 2013-03-12 12:30:30

+0

已更新至表達式語法並將其移至方法在DbContext模型上進行良好測量。 – James 2013-03-12 12:45:38