![](/img/trans.png)
[英]Identity Server 4 Asp.Net Identity + EF Core not Seeding
[英]Seeding asp.net core Identity Role
我正在尝试为 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 });
}
}
}
}
在启动类中调用: app app.EnsureRolesAreCreated();
当上面的代码运行时,CreateAsync 函数会抛出一个异常:
{Microsoft.EntityFrameworkCore.DbUpdateException:更新条目时出错。 有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 无法将值 NULL 插入到列“Id”、表“AspNetRoles”中; 列不允许空值。 插入失败。 该语句已终止。
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。
我发现了这个问题。 我失踪了:
base.OnModelCreating(modelBuilder);
在 ModelCreating 函数的开头
protected override void OnModelCreating(ModelBuilder modelBuilder){
base.OnModelCreating(modelBuilder);
}
进行更改后,我进行了迁移,现在将 ID 列创建为标识列
[Id] [int] IDENTITY(1,1) NOT NULL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.