c# - 使用children更新数据库条目

标签 c# asp.net asp.net-mvc asp.net-mvc-3 entity-framework

我有以下模型

public class CourseModel
{
    [Key]
    public int courseID { get; set; }
    ...
    public virtual ICollection<CourseMeetModel> meets { get; set; }
}

当我尝试编辑其中一个条目时,如果输入有效,则工作正常。 但是,如果无效,它会提醒用户错误。一旦用户修复了错误并尝试保存,我就会收到以下异常。

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

我注意到如果输入未通过 Controller 中的验证步骤,就会发生这种情况。

我的 Controller

public ActionResult EditCourseConfirmed(CourseModel course)
{
        CoursesDBContext db = new CoursesDBContext();
        bool valid = validateCouse(course); //If this fails and the course model is returned back to the view I get that error
        if (valid)
        {
                try
                {
                    db.Entry(course).State = EntityState.Modified;
                    db.SaveChanges();
                    Session[d.s_Clear] = false;
                    return RedirectToAction("Index");
                }
                catch (Exception e)
                {
                    ModelState.AddModelError(string.Empty, "Unable to save the course, please try again." + e.Message);
                    return View(course);
                }

        }

        return View(course);
}

最佳答案

试试这个

try {
   context.SaveChanges();
} 
catch (OptimisticConcurrencyException) 
{
    context.Refresh(RefreshMode.ClientWins, db.table);
    context.SaveChanges();
}

Prop :https://stackoverflow.com/a/6848729/1166147

根据您的评论添加解释。感谢您提供 EF4 CTP5 提示。很高兴这解决了问题,请标记为已接受。当您收到此错误时,发生了一些事情,在加载和更新之间更改了数据(另一个用户等),有一个触发器导致了问题,或者如果使用存储过程,它会命中 0 个记录。如果没有更多信息,很难知道。这是第一次更新吗?在用户遇到错误、修改然后尝试继续而不刷新之前是否先运行了另一个更新?你有什么触发因素吗?您的并发程度是多少 - 另一个用户在该用户的查询和更新之间是否进行了编辑和保存?阅读我给出的帖子的链接 - 有人提到实体键的元数据中的 ReadOnlyAttribute 被替换,这导致其值变为零作为潜在原因 - 我对此不确定,但这是有道理的 -

(修改自 MSDN)默认情况下, Entity Framework 实现乐观并发模型。这意味着在查询数据和更新数据之间不会对数据源中的数据保持锁定,如果其他用户修改了数据,则可能会出现此错误。使用此属性时, Entity Framework 会在保存更改之前检查数据库中的更改

任何冲突的更改都会导致 OptimisticConcurrencyException

当您定义使用存储过程更新数据源的实体数据模型时,也可能会发生 OptimisticConcurrencyException。在这种情况下,当用于执行更新的存储过程报告更新了零行时,会引发异常。 SET NOCOUNT ON 可以修复此问题。

关于c# - 使用children更新数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777481/

相关文章:

html - 如何在保持正确纵横比的同时保存缩略图?

asp.net-mvc - ASP.NET MVC 2 - UrlParameter.Optional 条目是否必须位于路由的末尾?

c# - 如何在 C# MVC 中接收 JSON 主体(无 ajax)

c# - Azure Keyvault 停止在 IIS 托管站点上工作

c# - 当我的鼠标指向 C# 中的按钮时,我想禁用其他按钮

c# - ListView 中多个属性的 DisplayMemberPath

asp.net - 在 ASP.NET 中从数据库自动生成 ID

asp.net - 最好监视的 ASP.NET 性能计数器是什么?

c# - ASP.NET MVC : Localization issues (wrong resx file for culture)

c# - 如何在 C# 或其他可用选项的递归函数中使用 db.savechange() 函数提高 Entity Framework 中数据保存的性能?