c# - 在注册时向身份用户添加角色失败,外键约束
Posted
技术标签:
【中文标题】c# - 在注册时向身份用户添加角色失败,外键约束【英文标题】:c# - Adding a role to idenitity user on signup fails with foreign key constraint 【发布时间】:2021-04-14 20:58:00 【问题描述】:我不知道这是否是重复的,但我找不到任何对我的案例有帮助的解决方案的类似问题。
所以我有一个身份用户,我想根据用户在注册页面上选择的下拉值添加一个角色。我测试了这部分,它通过就好了。但是无论我怎么尝试,添加一个角色似乎都不起作用。
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:INSERT 语句与 FOREIGN KEY 约束“FK_AspNetUserRoles_person_UserId”冲突。冲突发生在数据库“hospital-prod”、表“dbo.person”、列“person_id”中。 声明已终止。
当我在添加角色之前检查调试时,我从用户那里得到的值是正确的,所以变量 user
应该是正确的。
用户和患者/工作人员也已成功添加到数据库中,因此只有role
有问题。
【问题讨论】:
我认为这应该被标记为“实体框架”而不是“ASP.Net”。如果我对this answer 的理解正确,您应该先将用户添加到User
,然后再将其添加到Person
。但是,如果脚手架正确,EF 应该能够以正确的顺序自行完成所有操作。
@JHBonarius 我想我没有正确地澄清它。我的 User
是 Person
又名。 Person
类继承 IdentityUser
,所以它上面没有其他类。而且很奇怪,因为它都正确添加到数据库中,这就是为什么我不明白为什么错误是外键约束类型,当我尝试添加角色之前用户在数据库中时。
你能查一下this的答案吗?
是的,试过了,没有错误。我很感激你的帮助,但不知何故,我猜它只是不想工作。并且插入也有 fk 约束的 Patient 或 Worker 没有问题。这很奇怪。
@JHBonarius tnx 寻求帮助。当然,最后这是一个愚蠢的错误。 :)
【参考方案1】:
好的,所以我弄清楚了真正的问题是什么;如果其他人在某些时候处于相同的情况,我将简要解释一下。
在我的例子中添加角色的问题是 AddToRoleAsync(User user, String role)
方法接受用户类型变量而不是 ID,因此它自己选择 ID。
好吧,我有一个自定义数据库,其中我已经有一个 person_id
列,IdentityUser
的规则不允许您删除任何默认列,其中包括 Id
。所以问题是该方法自动选择了错误的id
,我必须更改 ids' 的行为才能使其工作/选择正确的。
【讨论】:
以上是关于c# - 在注册时向身份用户添加角色失败,外键约束的主要内容,如果未能解决你的问题,请参考以下文章
当角色名称需要与role_id匹配时(使用devise)添加要选择的角色来设计注册表单