如何在.NET CORE中更改默认的ASP.NET标识表名称?

Arc*_*dze 19 asp.net-mvc identity asp.net-core

我已经开始使用.NET Core,在MVC 5中我更改了默认表名称,例如:AspNETUsers以这种方式运行到用户并且它运行良好:在IdentityModels类中我dded:

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<IdentityUser>().ToTable("Users").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<ApplicationUser>().ToTable("Users").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
        modelBuilder.Entity<IdentityRole>().ToTable("Roles");
    }
Run Code Online (Sandbox Code Playgroud)

但它在.NET CORE(MVC 6)中不起作用.谁能帮我?非常感谢.

Ahm*_*bry 21

- 要更改这些表的名称(IdentityUserRole <Tkey>,IdentityUserToken <Tkey>,IdentityRoleClaim <Tkey>,IdentityUserClaim <Tkey>,IdentityUserLogin <Tkey>),您必须指定TKey的类型(用于主键的类型),默认情况下是字符串(GUID),即使您没有更改.

- 如果要将主键从GUID更改为int https://medium.com/@goodealsnow/asp-net-core-identity-3-0-6018fc151b4

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);

        builder.Entity<ApplicationUser>(entity =>
        {
            entity.ToTable(name: "User");         
        });

        builder.Entity<IdentityRole>(entity =>
        {
            entity.ToTable(name: "Role");
        });
        builder.Entity<IdentityUserRole<string>>(entity =>
        {
            entity.ToTable("UserRoles");
          //in case you chagned the TKey type
          //  entity.HasKey(key => new { key.UserId, key.RoleId });
        });

        builder.Entity<IdentityUserClaim<string>>(entity =>
        {
            entity.ToTable("UserClaims");
        });

        builder.Entity<IdentityUserLogin<string>>(entity =>
        {
            entity.ToTable("UserLogins");
             //in case you chagned the TKey type
          //  entity.HasKey(key => new { key.ProviderKey, key.LoginProvider });       
 });

        builder.Entity<IdentityRoleClaim<string>>(entity =>
        {
            entity.ToTable("RoleClaims");

        });

        builder.Entity<IdentityUserToken<string>>(entity =>
        {
            entity.ToTable("UserTokens");
            //in case you chagned the TKey type
           // entity.HasKey(key => new { key.UserId, key.LoginProvider, key.Name });

        });
    }
Run Code Online (Sandbox Code Playgroud)

  • 啊,我的错误是在这些语句之前没有调用base.OnModelCreating().我使用了这种格式:/sf/answers/2914400191/ (2认同)

Set*_*Set 18

尝试更改绑定

builder.Entity<ApplicationUser>(entity =>
       {
           entity.ToTable(name:"Users");
           entity.Property(e => e.Id).HasColumnName("UserId");

       });
Run Code Online (Sandbox Code Playgroud)

  • 我迟到了 4 年,但没有人参考微软官方文档来做到这一点,所以在这里:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/customize-identity -model?view=aspnetcore-5.0#customize-the-model (7认同)

And*_*iod 7

基于@ ahmed-al-jabry的答案的ASP.Net Core 2 / 2.1的完整列表。

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

    // Override default AspNet Identity table names
    modelBuilder.Entity<User>(entity => { entity.ToTable(name: "Users"); });
    modelBuilder.Entity<IdentityRole>(entity => { entity.ToTable(name: "Roles"); });
    modelBuilder.Entity<IdentityUserRole<string>>(entity => { entity.ToTable("UserRoles"); });
    modelBuilder.Entity<IdentityUserClaim<string>>(entity => { entity.ToTable("UserClaims"); });
    modelBuilder.Entity<IdentityUserLogin<string>>(entity => { entity.ToTable("UserLogins"); });
    modelBuilder.Entity<IdentityUserToken<string>>(entity => { entity.ToTable("UserTokens"); });
    modelBuilder.Entity<IdentityRoleClaim<string>>(entity => { entity.ToTable("RoleClaims"); });
}
Run Code Online (Sandbox Code Playgroud)


sgr*_*oft 6

仅出于文档目的,对于那些在未来的几年里来到这篇文章的人(像我一样 XD),问题的答案:

如何更改 .NET CORE 中的默认 ASP.NET Identity 表名称?

可以这样解决

   //Repeat with each table
   builder.Entity<ApplicationUser>(entity =>
   {
       entity.ToTable(name:"Users");
       entity.Property(e => e.Id).HasColumnName("UserId");

   });
Run Code Online (Sandbox Code Playgroud)

或者可以这样解决

        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<IdentityUserRole>().ToTable("MyUserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("MyUserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims");
        modelBuilder.Entity<IdentityRole>().ToTable("MyRoles");
Run Code Online (Sandbox Code Playgroud)

但是你可以简单地使用 Alexandru Bucur 在他的博客上给出的方法,并在 netcore 2.2 上进行了测试

         foreach (var entityType in modelBuilder.Model.GetEntityTypes())
         {
            var table = entityType.Relational().TableName;
             if (table.StartsWith("AspNet"))
             {
                 entityType.Relational().TableName = table.Substring(6);
             }
         };
Run Code Online (Sandbox Code Playgroud)

但这不再支持 netcore > 2.2,所以,我需要修复它,这是 NetCore > 2.2 上的功能方式

        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            var tableName = entityType.GetTableName();
            if (tableName.StartsWith("AspNet"))
            {
                entityType.SetTableName(tableName.Substring(6));
            }
        }
Run Code Online (Sandbox Code Playgroud)

选择你喜欢的并享受它,HappyCoding


小智 5

 protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>(b =>
            {
                b.ToTable("ANYName");
            });
            modelBuilder.Entity<IdentityUserRole<string>>(b =>
            {
                b.ToTable("ANYName");
            });
            modelBuilder.Entity<IdentityRole<string>>(b =>
            {
                b.ToTable("ANYName");
            });
            modelBuilder.Entity<IdentityUserClaim<string>>(b =>
            {
                b.ToTable("ANYName");
            });
            modelBuilder.Entity<IdentityUserLogin<string>>(b =>
            {
                b.ToTable("ANYName");
            });
            modelBuilder.Entity<IdentityUserToken<string>>(b =>
            {
                b.ToTable("ANYName");
            });
            modelBuilder.Entity<IdentityRole>(b =>
            {
                b.ToTable("ANYName");
            });
            modelBuilder.Entity<IdentityRoleClaim<string>>(b =>
            {
                b.ToTable("ANYName");
            });
            modelBuilder.Entity<IdentityUserRole<string>>(b =>
            {
                b.ToTable("ANYName");
            });
        }
Run Code Online (Sandbox Code Playgroud)

在 ApplicationDbContext 和 add-migration 中添加此方法以创建更改,然后更新数据库以保存更改。