2016-07-14 20 views
0

我一直在努力與這個錯誤在過去的一天左右。我已經調試它多次,並且每個崩潰在這一行時間:ASP.NET MVC EntityState.Modified崩潰

db.Entry(article).State = EntityState.Modified; 

註釋掉線擺脫了大跌,但記錄中沒有在數據庫中得到更新。

這裏是整個代碼:

[HttpPost] 
    [Authorize] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "ArticleId,MainTitle,SubTitle,DatePublished,Content,ImagePath,UserAccountId")] Article article) 
    { 
     if (ModelState.IsValid) 
     { 
      // This is necessary so that we can preserve the original publish date: 
      var originalArticle = db.Articles.Where(a => a.ArticleId == article.ArticleId).First(); 
      article.DatePublished = originalArticle.DatePublished; 

      // This is necessary so that we can preserve who was the original poster: 
      article.UserAccountId = originalArticle.UserAccountId; 


      //db.Entry(article).State = EntityState.Modified; <---- Crashes 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.UserAccountId = new SelectList(db.UserAccounts, "UserAccountId", "FirstName", article.UserAccountId); 
     return View(article); 
    } 

我真的很感激,如果有人可以幫助我走出這件事情! :)

EDIT:這是所拋出的異常:

「‘System.InvalidOperationException’類型的異常出現在EntityFramework.dll但在用戶代碼中沒有處理

其他信息:附加一個類型「TheNewsBETA.Models.Article」的實體失敗,因爲同一類型的另一實體已經具有相同的主密鑰值。使用「連接」的方法或設置一個實體的狀態設置爲「未改變」或「修飾時,這可能發生「如果圖中的任何實體有衝突的鍵值。這可能是因爲一些實體是新的,但尚未收到數據庫生成的鍵值。在這種情況下使用‘添加’實現方法具d或「已添加」實體狀態來跟蹤圖形,然後根據情況將非新實體的狀態設置爲「未更改」或「已修改」。

+0

「它崩潰」不是回答的。檢查實際異常及其內部異常,並研究這些異常。 – CodeCaster

+0

請原諒我的無知,被拋出的異常是:「類型的異常‘System.InvalidOperationException’發生在EntityFramework.dll但在用戶代碼中沒有處理」 –

+0

請[編輯]它變成你的問題,而不是研究它。 – CodeCaster

回答

1

好吧,這固定它創建編輯方法中的新情況和之前應用相同的操作,以新的上下文(到目前爲止我試着將它們應用到這是一個私人領域對於整個上下文的事ArticleController類)。這是尼利什建議的,我甚至不需要使用附件。 我也試過它拋出一個異常點之前添加db.Articles.Attach(article),但是這似乎並沒有幫助。 我想感謝所有提供他們想法和建議的人!

這裏的代碼看起來現在:

if (ModelState.IsValid) 
     { 
      var newContext = new ApplicationDbContext(); 


      // This is necessary so that we can preserve the original publish date: 
      var originalArticle = db.Articles.Where(a => a.ArticleId == article.ArticleId).First(); 
      article.DatePublished = originalArticle.DatePublished; 

      // This is necessary so that we can preserve who was the original poster: 
      article.UserAccountId = originalArticle.UserAccountId; 

      newContext.Entry(article).State = EntityState.Modified; 
      newContext.SaveChanges(); 
      /* Old code that didn't work: 
      db.Entry(article).State = EntityState.Modified; 
      db.SaveChanges(); 
      */ 
      return RedirectToAction("Index"); 
     }