ASP.NET MVC EntityState.Modified crash
本文关键字:Modified crash EntityState MVC NET ASP | 更新日期: 2023-09-27 17:56:51
过去一天左右我一直在为这个错误而苦苦挣扎。我已经调试了它很多次,每次它都在此行崩溃:
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);
}
如果有人能帮我解决这个问题,我将不胜感激! :)
编辑:这是抛出的异常:
"EntityFramework 中发生了类型为'System.InvalidOperationException' 的异常.dll但未在用户代码中处理
其他信息:附加类型为"TheNewsBETA.Models.Article"的实体失败,因为相同类型的另一个实体已具有相同的主键值。使用"附加"方法或将实体的状态设置为"未更改"或"已修改"(如果图形中的任何实体具有冲突的键值)时,可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用'添加'方法或'已添加'实体状态来跟踪图形,然后根据需要将非新实体的状态设置为'未更改'或'已修改'。
好的,修复它的事情是在 Edit 方法中创建一个新上下文并将与以前相同的操作应用于新上下文(到目前为止,我尝试将它们应用于作为整个 ArticleController 类的私有字段的上下文)。这是Nilesh建议的,我什至不必使用附件。 我还尝试在引发异常之前添加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");
}