【问题标题】:Cannot update record in entity framework无法更新实体框架中的记录
【发布时间】:2020-01-07 22:05:19
【问题描述】:

我得到的错误信息是这样的:DbUpdateConcurrencyException

我正在使用更新 IdentityRole 表。我正在使用 ViewModel 来显示和捕获数据,然后在我的 OnPost() 中将其传回。数据按预期进入我的 IdentityRole 属性。我确保主键隐藏在表单中。我还尝试将 _context.Update(Role) 与 SaveChanges() 结合使用,但我总是遇到同样的错误。我还确保我的 ViewModel 和 IdentityRole 属性都有 [BindProperty]。

这是我的控制器或代码。

    public IActionResult OnPost()
    {
        Role.Name = RoleViewModel.RoleName;
        Role.NormalizedName = RoleViewModel.RoleName.ToUpper();
        Role.ConcurrencyStamp = DateTime.Now.ToString();

        if (!ModelState.IsValid)
        {
            return Page();
        }

        _context.Entry(Role).Property(x => x.Name).IsModified = true;
        _context.Entry(Role).Property(x => x.NormalizedName).IsModified = true;
        _context.Entry(Role).Property(x => x.ConcurrencyStamp).IsModified = true;

        _context.SaveChanges();
        return Redirect("/Admin/HomeRole");
    }

我的视图模型

public class EditRoleViewModel
{
    public EditRoleViewModel()
    {
        Users = new List<string>();
    }

    public string Id { get; set; }

    [Required(ErrorMessage = "Role Name is required")]
    public string RoleName { get; set; }

    public List<string> Users { get; set; }
}

这是表格

    <form method="post" class="mt-3">
        <input asp-for="RoleViewModel.Id" type="hidden" />
        <input asp-for="RoleViewModel.Users" type="hidden" />
        <div class="form-group row">
            <label asp-for="RoleViewModel.RoleName" class="col-sm-2 col-form-label"></label>
            <div class="col-sm-10">
                <input asp-for="RoleViewModel.RoleName" class="form-control">
                <span asp-validation-for="RoleViewModel.RoleName" class="text-danger"></span>
            </div>
        </div>
</form>

【问题讨论】:

  • 您确定您的模型正在获取 ID 吗?当 EF 期望在数据库中更新记录但没有更新行时,通常会出现此错误。 stackoverflow.com/questions/26148793/…
  • 是的,我将模型路由到我的 OnPost 方法,但我仍然遇到同样的错误。我还检查了我正在路由的模型的 ID,并将其与我正在更改的项目的 ID 匹配,它们确实匹配。

标签: c# asp.net .net entity-framework mvvm


【解决方案1】:

根据我在您的问题中看到的,您需要传递 Http Post 的 ID。我了解您将 Id 隐藏在表单中,但您需要将其传递给控制器​​,然后传递给模型以保存。所以,如下所示,

public IActionResult OnPost(RoleViewModel model){......}

然后分配 ID。如果您正在更新没有 Id 的行,那么您将在 DbContext 中收到此异常。

For further reading in MSDN

Asp.Net controller snippets

也检查这些。试着告诉我。

【讨论】:

  • 我将模型路由到我的 OnPost 方法,但仍然出现相同的错误。我阅读了 MSDN 文章,它说“这通常表明数据库已同时更新,因此预期匹配的并发令牌实际上不匹配。”这是有道理的,但我会假设这将是我的主键,它确实匹配并且没有更改。
【解决方案2】:

这是我的问题的答案

    public async Task<IActionResult> OnPost(EditRoleViewModel roleViewModel)
    {
        var role = await roleManager.FindByIdAsync(roleViewModel.Id);

        role.Name = roleViewModel.RoleName;

        var result = await roleManager.UpdateAsync(role);

        return Page();
    }

【讨论】:

  • 这是您问题的答案吗?请提供更多细节。
猜你喜欢
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多