ASP.NET MVC EntityState.Modified崩溃

时间:2016-07-14 10:53:19

标签: c# sql asp.net-mvc entity-framework

过去一天左右,我一直在努力解决这个错误。我已经调试了很多次,每次都在这行崩溃:

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.dll中出现'System.InvalidOperationException'类型的异常,但未在用户代码中处理

附加信息:附加“TheNewsBETA.Models.Article”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。“

1 个答案:

答案 0 :(得分:2)

好吧,修复它的事情是在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");
        }