如何一次创建多个角色? asp.net核心

问题描述

我正在尝试开发一种算法,该算法在项目的首次使用开始时会创建许多角色。 它需要如下所示的“异步等待”任务。

    [HttpGet]
    public async Task<IActionResult> LoginAsync()
    {
        int rolesCount = roleManager.Roles.Count();
        string[] roles = { "Teacher","Student" };
        var role = new IdentityRole();

        if (rolesCount == 0)
        {
            for (int i = 0; i < roles.Length; i++)
            {
                if (!await roleManager.RoleExistsAsync(roles[i]))
                {
                    role.Name = roles[i];
                    await roleManager.CreateAsync(role);
                }
            }
        }
        return View();
    }

显示错误

sqlException:违反主键约束'PK_AspNetRoles'。 无法在对象'dbo.AspNetRoles'中插入重复的密钥。重复的 键值为(f32270bc-a54a-42a4-8968-9e402ddaeb0e)。 该声明已终止。

第二个角色“ Student”的循环期间,第一个角色“ Teacher”的主键未更改的问题。这样就会出现约束冲突。

那么,如何在“异步等待”任务中一次创建多个角色?

解决方法

您可以这样更改代码:

[HttpGet]
    public async Task<IActionResult> LoginAsync()
    {
        int rolesCount = roleManager.Roles.Count();
        string[] roles = { "Teacher","Student" };
        

        if (rolesCount == 0)
        {
            for (int i = 0; i < roles.Length; i++)
            {
                if (!await roleManager.RoleExistsAsync(roles[i]))
                {
                    var role = new IdentityRole();
                    role.Name = roles[i];
                    await roleManager.CreateAsync(role);
                }
            }
        }
        return View();
    }

使用var role = new IdentityRole();时,它将为角色创建一个ID。在您的代码中,您将代码置于for循环之外,因此,当您运行await roleManager.CreateAsync(role);时,角色.Id将相同。您只需更改角色名称即可。

这是一个测试: enter image description here