我得到的错误消息是: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");
}
我的ViewModel
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>
答案 0 :(得分:0)
根据我在您的问题中看到的内容,您需要传递Http Post的ID。我了解您在表单中隐藏了ID,但是您需要将其传递给控制器,然后传递给模型进行保存。因此,如下所示,
public IActionResult OnPost(RoleViewModel model){......}
然后分配ID。如果要更新不带ID的行,则将在DbContext中得到此异常。
也检查这些。尝试让我知道。
答案 1 :(得分:0)
这是我问题的答案
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();
}