在 EF Core 3 中重命名 IdentityRole 表

Posted

技术标签:

【中文标题】在 EF Core 3 中重命名 IdentityRole 表【英文标题】:Rename IdentityRole table in EF Core 3 【发布时间】:2021-04-13 12:48:05 【问题描述】:

我在 EF Core 3 中扩展 IdentityRole 角色时遇到问题。我想重命名表并添加一个属性,但是当我搭建表时,它会将其创建为“IdentityRole”而不是我指定的名称“ApplicationRole”和它不支持我添加的属性。

在startup.cs中

            services
            .AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = false)
            .AddRoles<IdentityRole>()
            .AddSignInManager<SignInManager<ApplicationUser>>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

我的课。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ApplicationUser>().ToTable("ApplicationUser");
        modelBuilder.Entity<IdentityRole>().ToTable("ApplicationRole");


public class ApplicationUser : IdentityUser

    [PersonalData]
    public string FirstName  get; set;  = null!;

    [PersonalData]
    public string LastName  get; set;  = null!;


public class ApplicationRole : IdentityRole

    public string Description  get; set; 

什么是脚手架...

            migrationBuilder.CreateTable(
            name: "IdentityRole",
            columns: table => new
            
                Id = table.Column<string>(nullable: false),
                Name = table.Column<string>(maxLength: 256, nullable: true),
                NormalizedName = table.Column<string>(maxLength: 256, nullable: true),
                ConcurrencyStamp = table.Column<string>(nullable: true)
            ,
            constraints: table =>
            
                table.PrimaryKey("PK_IdentityRole", x => x.Id);
            );

已更新。正如其他人所建议的那样,我尝试了 Microsoft Docs 中的不同实现,如下所示

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
   
public class ApplicationUser : IdentityUser<Guid>
    
public class ApplicationRole : IdentityRole<Guid>

services.AddDefaultIdentity<ApplicationUser>()
  .AddRoles<ApplicationRole>()
  .AddSignInManager<SignInManager<ApplicationUser>>()
  .AddEntityFrameworkStores<ApplicationDbContext>();

当我做初始脚手架时,这给我留下了一大堆错误。

访问 Microsoft.Extensions.Hosting 时出错 服务。在没有应用程序服务提供商的情况下继续。错误: 某些服务无法构建(验证时出错 服务描述符'ServiceType: Microsoft.AspNetCore.Identity.ISecurityStampValidator 生命周期:范围 实施类型: Microsoft.AspNetCore.Identity.SecurityStampValidator1[Portal.Data.Entities.ApplicationUser]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.RoleManager1[Microsoft.AspNetCore.Identity.IdentityRole]' 在尝试激活时 'Portal.Security.AdditionalUserClaimsPrincipalFactory'。)(出错时 验证服务描述符 'ServiceType: Microsoft.AspNetCore.Identity.IwoFactorSecurityStampValidator 生命周期:范围实施类型: Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator1[Portal.Data.Entities.ApplicationUser]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.RoleManager1[Microsoft.AspNetCore.Identity.IdentityRole]' 在尝试激活时 'Portal.Security.AdditionalUserClaimsPrincipalFactory'。)(出错时 验证服务描述符 'ServiceType: Microsoft.AspNetCore.Identity.SignInManager1[Portal.Data.Entities.ApplicationUser] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.SignInManager1[Portal.Data.Entities.ApplicationUser]': 无法解析类型的服务 'Microsoft.AspNetCore.Identity.RoleManager1[Microsoft.AspNetCore.Identity.IdentityRole]' while attempting to activate 'Portal.Security.AdditionalUserClaimsPrincipalFactory'.) (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.ISecurityStampValidator Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.SecurityStampValidator1[Portal.Data.Entities.ApplicationUser]': 无法解析类型的服务 'Microsoft.AspNetCore.Identity.RoleManager1[Microsoft.AspNetCore.Identity.IdentityRole]' while attempting to activate 'Portal.Security.AdditionalUserClaimsPrincipalFactory'.) (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.ITwoFactorSecurityStampValidator Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator1[Portal.Data.Entities.ApplicationUser]': 无法解析类型的服务 'Microsoft.AspNetCore.Identity.RoleManager1[Microsoft.AspNetCore.Identity.IdentityRole]' while attempting to activate 'Portal.Security.AdditionalUserClaimsPrincipalFactory'.) (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.SignInManager1[Portal.Data.Entities.ApplicationUser] 生命周期:范围实施类型: Microsoft.AspNetCore.Identity.SignInManager1[Portal.Data.Entities.ApplicationUser]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.RoleManager1[Microsoft.AspNetCore.Identity.IdentityRole]' 在尝试激活时 'Portal.Security.AdditionalUserClaimsPrincipalFactory'。)(出错时 验证服务描述符 'ServiceType: Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory1[Portal.Data.Entities.ApplicationUser] Lifetime: Scoped ImplementationType: Portal.Security.AdditionalUserClaimsPrincipalFactory': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.RoleManager1[Microsoft.AspNetCore.Identity.IdentityRole]' 在尝试激活时 'Portal.Security.AdditionalUserClaimsPrincipalFactory'。)无法 创建一个“ApplicationDbContext”类型的对象。对于不同的 设计时支持的模式,请参阅 https://go.microsoft.com/fwlink/?linkid=851728

【问题讨论】:

可以参考official doc。 在官方文档中尝试了一些我没有做的事情,但它仍然不起作用,我收到错误“无法创建'ApplicationDbContext'类型的对象。”。不知道为什么尝试以我想要的方式命名我的数据库中的表并添加几个自定义属性是如此困难。 【参考方案1】:

为了指定角色的实体类型,您需要从IdentityDbContext&lt;TUser,TRole,TKey&gt;而不是IdentityDbContext&lt;TUser&gt;继承,否则基础IdentityDbContext无法知道您的角色实体是什么。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>

【讨论】:

我已经尝试过了,但是当我脚手架时出现错误->“无法创建'ApplicationDbContext'类型的对象。 在 startup.cs 中,您是否尝试将 .AddRoles&lt;IdentityRole&gt;() 替换为 .AddRoles&lt;ApplicationRole&gt;() 是的,我仍然收到错误 -> 无法创建类型为“ApplicationDbContext”的对象。

以上是关于在 EF Core 3 中重命名 IdentityRole 表的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色

将现有 Microsoft.AspNet.Identity DB (EF 6) 迁移到 Microsoft.AspNetCore.Identity (EF Core)

EF Core 2.0 Identity - 添加导航属性

在 Entity Framework Core 中重命名外键而不删除数据

在 .net core openid 连接配置中重命名配置文件声明映射

Microsoft.AspNetCore.Identity 和 EF Core,在测试旧密码时重置用户密码