c# - 在注册时向身份用户添加角色因外键约束而失败

c# - Adding a role to idenitity user on signup fails with foreign key constraint

我不知道这是否重复,但我找不到对我的情况有帮助的解决方案的任何类似问题。

所以我有一个身份用户,我想根据用户在注册页面上选择的下拉值向其添加角色。我测试了这部分,一切顺利。但是无论我怎么尝试添加角色似乎都不起作用。

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
        returnUrl = returnUrl ?? Url.Content("~/");
        ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
        bool ownerRoleExists = await _roleManager.RoleExistsAsync("Owner");

        if (!ownerRoleExists)
        {
            var roleResult = await _roleManager.CreateAsync(new IdentityRole("Owner"));
        }

        bool patientRoleExists = await _roleManager.RoleExistsAsync("Patient");

        if (!patientRoleExists)
        {
            var roleResult = await _roleManager.CreateAsync(new IdentityRole("Patient"));
        }

        bool workerRoleExists = await _roleManager.RoleExistsAsync("Worker");

        if (!workerRoleExists)
        {
            var roleResult = await _roleManager.CreateAsync(new IdentityRole("Worker"));
        }

        if (ModelState.IsValid)
        {
            var user = new Person { UserName = Input.Email, Email = Input.Email, Name = Input.Name, LastName = Input.LastName, Address = Input.Address };
            var result = await _userManager.CreateAsync(user, Input.Password);

            if (result.Succeeded)
            {
                if (Input.PersonType.Equals("patient"))
                {
                    var patient = new Patient { PersonId = user.PersonId, VisitCount = 0, Number = Input.Number };
                    _context.Add(patient);
                    var patient_result = await _context.SaveChangesAsync();

                    if(patient_result > 0)
                    {
                        var result_role = await _userManager.AddToRoleAsync(user, "Patient");
                    }
                }
                else if(Input.PersonType.Equals("worker"))
                {
                    var worker = new Worker { PersonId = user.PersonId, WorkCode = Input.WorkCode };
                    _context.Add(worker);
                    var worker_result = await _context.SaveChangesAsync();

                    if(worker_result > 0)
                    {
                        var result_role = await _userManager.AddToRoleAsync(user, "Worker");
                    }
                }
                
                _logger.LogInformation("User created a new account with password.");
            }
        }
}

我得到的错误是:

SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_AspNetUserRoles_person_UserId". The conflict occurred in database "hospital-prod", table "dbo.person", column 'person_id'.
The statement has been terminated.

我从用户那里得到的值是正确的,当我在添加角色之前检查调试时,变量 user 应该是正确的。

另外用户和patient/worker都成功添加到数据库中,所以只有role有问题。

好的,所以我想出了真正的问题是什么;如果其他人在某个时候处于相同情况,我将简要解释一下。

在我的案例中添加角色的问题是方法 AddToRoleAsync(User user, String role) 接受用户类型变量而不是 ID,因此它自己选择 ID。

好吧,我有一个自定义数据库,其中已经有一个 person_id 列,并且 IdentityUser 的规则不允许您删除任何默认列,其中包括 Id。所以问题是该方法自动选择了错误的 id,我不得不更改 ids 的行为以使其成为正确的 work/select。