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 我想我没有正确地澄清它。我的 UserPerson 又名。 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)添加要选择的角色来设计注册表单

完整性约束违规:1452 无法添加或更新子行:外键约束失败

MySQL - 无法添加或更新子行:外键约束失败

SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败 - Laravel

将登录用户的角色存储在 vuex 安全/最佳实践中吗?

:完整性约束违规:1452 无法添加或更新子行:laravel 迁移中的外键约束失败