【问题标题】:Seeding asp.net core Identity Role播种 asp.net 核心身份角色
【发布时间】:2016-09-10 13:30:01
【问题描述】:

我正在尝试为 AspNetRole 表添加初始系统角色。

播种扩展:

public static void EnsureRolesAreCreated(this IApplicationBuilder app) {
        Dictionary<string, string> roles = new Dictionary<string, string>
        {
            { "Administrator", "Global Access." },
            { "User", "Restricted to business domain activity." }
        };

        var context = app.ApplicationServices.GetService<ApplicationDbContext>();
        if (context.AllMigrationsApplied()) {
            var roleManager = app.ApplicationServices.GetService<ApplicationRoleManager>();
            foreach (var role in roles) {
                if (!roleManager.RoleExistsAsync(role.Key).Result) {
                    roleManager.CreateAsync(new ApplicationRole() { Name = role.Key, System = true, Description = role.Value });
                }
            }
        }
    }

在启动类中调用:appapp.EnsureRolesAreCreated();

上面的代码运行时,CreateAsync函数抛出异常:

{Microsoft.EntityFrameworkCore.DbUpdateException:更新条目时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException:无法将值 NULL 插入到列“Id”、表“AspNetRoles”中;列不允许空值。插入失败。 声明已终止。

我试过Thisthis,还是不行。

services.AddIdentity<ApplicationUser, ApplicationRole>(config => {
            config.User.RequireUniqueEmail = true;
            config.Lockout = new LockoutOptions {
                AllowedForNewUsers = true,
                DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30),
                MaxFailedAccessAttempts = 5
            };
            config.Password = new PasswordOptions {
                RequireDigit = true,
                RequireNonAlphanumeric = false,
                RequireUppercase = true,
                RequireLowercase = true,
                RequiredLength = 12,
            };
        })
        .AddEntityFrameworkStores<ApplicationDbContext, int>()
        .AddUserValidator<ApplicationUserValidator<ApplicationUser>>()
        .AddUserManager<ApplicationUserManager>()
        .AddRoleManager<ApplicationRoleManager>()
        .AddDefaultTokenProviders();



public class ApplicationUser : IdentityUser<int> {}
public class ApplicationRole : IdentityRole<int> {}


protected override void OnModelCreating(ModelBuilder modelBuilder) {

        modelBuilder.Entity<ApplicationUser>(i => {
            i.HasKey(x => x.Id);
            i.Property(x => x.Id).ValueGeneratedOnAdd();
        });
        modelBuilder.Entity<ApplicationRole>(i => {
            i.HasKey(x => x.Id);
            i.Property(x => x.Id).ValueGeneratedOnAdd();
        });
        modelBuilder.Entity<IdentityUserRole<int>>(i => {
            i.HasKey(x => new { x.RoleId, x.UserId });
        });

        modelBuilder.Entity<IdentityUserLogin<int>>(i => {
            i.HasKey(x => new { x.ProviderKey, x.LoginProvider });
        });

        modelBuilder.Entity<IdentityRoleClaim<int>>(i => {
            i.HasKey(x => x.Id);
            i.Property(x => x.Id).ValueGeneratedOnAdd();
        });

        modelBuilder.Entity<IdentityUserClaim<int>>(i => {
            i.HasKey(x => x.Id);
            i.Property(x => x.Id).ValueGeneratedOnAdd();
        });
   }

我添加了ValueGeneratedOnAdd() 以尝试强制生成 ID。

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-identity asp.net-core-mvc


    【解决方案1】:

    我发现了问题。我失踪了:

    base.OnModelCreating(modelBuilder);
    

    在 ModelCreating 函数的开头

     protected override void OnModelCreating(ModelBuilder modelBuilder){
            base.OnModelCreating(modelBuilder);
     }
    

    进行更改后,我进行了迁移,ID 列现在创建为身份列

    [Id] [int] IDENTITY(1,1) NOT NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2021-12-11
      • 2021-11-05
      • 2019-03-26
      • 2020-09-23
      • 2020-11-28
      • 2016-09-05
      相关资源
      最近更新 更多