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

44

我已经开始使用.NET Core,在MVC 5中,我将默认表名更改为例如:AspNETUsers到Users以这种方式,并且它完美地运行:

IdentityModels类中,我添加了:

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");
    }

但它在ASP.NET CORE(MVC 6)中不起作用。 有人可以帮帮我吗? 非常感谢。


2
请勿将.NET Core视作ASP.NET Core的同义词!.NET Core是一个运行时,就像.NET 4.x运行时一样。而ASP.NET Core是个框架/网络堆栈,可以在.NET Core和.NET >=4.5.1上运行。 - Tseng
@Tseng,我正在学习Core,确实ASP.NET和Core之间有很多不同。 - Archil Labadze
11个回答

34

-要更改这些表(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 });

        });
    }

在SO上,仅提供代码的答案是不被鼓励的。您能否用几个词语解释一下这个答案在多大程度上解决了问题?! - ImportanceOfBeingErnest
我将上述代码添加到了我的asp.net core 2.0 mvc应用程序中。清理并重新构建了项目,删除了迁移文件夹,然后在nuget控制台中运行了update-database命令,但它仍然使用原始的AspNet*名称创建了身份验证表。 - alexb
嗨Alexb,我创建了一个新的.NET Core 2.0,并使用相同的代码更改默认的ASP.NET身份表名称,它在我的机器上运行良好。你有检查ApplicationDbContextModelSnapshot以查看迁移是否成功使用新表名吗? - Ahmed Al Jabry
2
啊,我的错误是在这些语句之前没有调用base.OnModelCreating()。我使用了这种格式:https://stackoverflow.com/a/41634288/13700 - Chris
1
一直在为此纠结,犯了同样的错误,在配置完成后调用了 base.OnModelCreating()。这解决了我的问题。 - Niklas
显示剩余2条评论

28
尝试将绑定更改为:
builder.Entity<ApplicationUser>(entity =>
       {
           entity.ToTable(name:"Users");
           entity.Property(e => e.Id).HasColumnName("UserId");

       });

6
我晚了4年才来参加派对,但是没有人提到如何使用微软官方文档来完成这件事,所以在这里提供链接:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-5.0#customize-the-model - JED

14

基于 @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"); });
}

你有Asp.Core 2.1的吗? - Bruno Henri
适用于2.2版本。最近遇到了一个有趣的问题,生成了两个角色表:aspnet_rolesRole。问题在于我使用了:builder.Entity<IdentityRole<string>>(entity => { entity.ToTable("Role"); });而不是通用的builder.Entity<IdentityRole>(entity => { entity.ToTable("Role"); });。希望这对任何人有所帮助。 - Andrey Borisko
也适用于核心 3.1。 - DavidC

6

仅供文档记录,为未来的读者(比如我XD)提供答案:

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

可以通过以下方式解决:

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

   });

或者可以这样解决

        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");

但是,您可以使用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);
             }
         };

但是这个功能在 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));
            }
        }

选择您喜欢的并享受它,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");
            });
        }

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

2

需要执行以下两个步骤来应用更改:

  • 执行Add-Migration命令
  • 执行Update-database命令

一直碰壁,直到看到这个评论才恍然大悟。 - Dan Orlovsky

2

我添加了第二个答案,因为很多人在尝试更改.NET core 1、2、3和.NET 5中的表名时会遇到这个问题。

该过程非常简单,并且在文档中有很好的解释。

对于那些需要快速修复的人:

  1. Inherit all your models which you want to change( default Microsoft authorization comes with 7 models ). For example changing AspNetUsers to User and AspNetRoles to Role you can do the following in your existing models:

     public partial class User : IdentityUser<int>
     {
         // code
     }
    
     public partial class Role : IdentityRole<int>
     {
         // code
     }
    

在这个例子中,我改变了主键类型,因为默认值是nvarchar

  1. In your context inherit from IdentityDbContext and use the same type as argument:

     public class AppDbContext : IdentityDbContext<User, Role, int>
     {
         // code
     }
    
  2. Next we have to update ConfigureServices in StartUp to use the new User class:

      services.AddDefaultIdentity<User, Role>()
      .AddEntityFrameworkStores<AppDbContext>();
    

如果需要迁移更新/创建数据库,则取决于项目是新项目还是旧项目。

注意:如果您当前在项目中使用身份验证,例如 UserManagerSignInManager,则必须将它们的泛型参数更改为新的参数,如下所示:

SignInManager<User>
UserManager<User>

希望能帮到您 :)

1

更新默认表名IdentityModels类MVC

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

        modelBuilder.Entity<IdentityUser>().ToTable("Users").HasKey(x => x.Id);
        modelBuilder.Entity<ApplicationUser>().ToTable("Users").HasKey(x => x.Id);
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles").HasKey(x => x.RoleId);;
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins").HasKey(x => x.UserID);;
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims").HasKey(x => x.Id);;
        modelBuilder.Entity<IdentityRole>().ToTable("Roles").HasKey(x => x.Id);;
    }

1

有一个额外的注意事项: 我自定义了所有的身份表名称,但它没有应用。根据微软参考文献,您必须在自定义之前使用base.OnModelCreating(builder);

要更改表和列的名称,请调用base.OnModelCreating。然后,添加配置以覆盖任何默认值。例如,要更改所有Identity表的名称:

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

    modelBuilder.Entity<IdentityUser>(b =>
    {
       b.ToTable("MyUsers");
    });

    modelBuilder.Entity<IdentityUserClaim<string>>(b =>
    {
        b.ToTable("MyUserClaims");
    });

    modelBuilder.Entity<IdentityUserLogin<string>>(b =>
    {
        b.ToTable("MyUserLogins");
    });

    modelBuilder.Entity<IdentityUserToken<string>>(b =>
    {
        b.ToTable("MyUserTokens");
    });

    modelBuilder.Entity<IdentityRole>(b =>
    {
        b.ToTable("MyRoles");
    });

    modelBuilder.Entity<IdentityRoleClaim<string>>(b =>
    {
        b.ToTable("MyRoleClaims");
    });

    modelBuilder.Entity<IdentityUserRole<string>>(b =>
    {
        b.ToTable("MyUserRoles");
    });
}

0

对于MVC5 IdentityModels

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<IdentityUser>().Table("Users").Key(x => x.Id);
            builder.Entity<ApplicationUser>().Table("Users").Key(x => x.Id);
            builder.Entity<IdentityUserRole>().Table("UserRoles").Key(x => x.RoleId); ;
            builder.Entity<IdentityUserLogin>().Table("UserLogins").Key(x => x.UserId); ;
            builder.Entity<IdentityUserClaim>().Table("UserClaims").Key(x => x.Id); ;
            builder.Entity<IdentityRole>().Table("Roles").Key(x => x.Id); ;

        }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接