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。
我不知道这是否重复,但我找不到对我的情况有帮助的解决方案的任何类似问题。
所以我有一个身份用户,我想根据用户在注册页面上选择的下拉值向其添加角色。我测试了这部分,一切顺利。但是无论我怎么尝试添加角色似乎都不起作用。
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。