Невозможно обновить запись в структуре объекта - PullRequest
0 голосов
/ 08 января 2020

Я получаю сообщение об ошибке: DbUpdateConcurrencyException

Я использую обновление таблицы IdentityRole. Я использую ViewModel для отображения и захвата данных, а затем передаю их обратно в моем OnPost (). Данные поступают в мое свойство IdentityRole, как и ожидалось. Я убедился, что первичный ключ скрыт в форме. Я также пробовал _context.Update (Role) в сочетании с SaveChanges (), и я всегда получаю ту же ошибку. Я также гарантировал, что у меня есть [BindProperty] как для моих свойств ViewModel, так и для моих свойств IdentityRole.

Вот мой контроллер или код позади.

    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>

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Вот ответ на мой вопрос

    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();
    }
0 голосов
/ 08 января 2020

Из того, что я вижу в вашем вопросе, вам нужно передать Id для Http Post. Я понимаю, что вы скрываете идентификатор в форме, но вам нужно передать его контроллеру, а затем модели для сохранения. Итак, что-то вроде ниже,

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

, затем назначьте Id. Если вы обновляете строку без идентификатора, вы получите это исключение в DbContext.

Для дальнейшего чтения в MSDN

Asp. Net фрагменты контроллера

Проверьте это тоже. Попробуйте и дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...