如何在使用ASP.NET标识时更改表名?

时间:2013-10-18 23:09:33

标签: c# asp.net-identity

我正在使用Visual Studio 2013的发布版本(RTM,而不是RC)(从MSDN 2013-10-18下载),因此使用AspNet.Identity的最新版本(RTM)。当我创建一个新的Web项目时,我选择“个人用户帐户”进行身份验证。这将创建以下表格:

  1. AspNetRoles
  2. AspNetUserClaims
  3. AspNetUserLogins
  4. AspNetUserRoles
  5. AspNetUsers
  6. 当我注册一个新用户(使用默认模板)时,会创建这些表(如上所列),并且AspNetUsers表中插入的记录包含:

    1. 编号
    2. 用户名
    3. PasswordHash
    4. SecurityStamp
    5. 鉴别
    6. 此外,通过向“ApplicationUser”类添加公共属性,我已成功向AspNetUsers表添加了其他字段,例如“FirstName”,“LastName”,“PhoneNumber”等。

      这是我的问题。有没有办法更改上面表格的名称(首次创建它们时)或者它们是否总是以我上面列出的AspNet前缀命名?如果表名可以不同的名称,请解释如何。

      - 更新 -

      我实施了@Hao Kung的解决方案。它确实创建了一个新表(例如我称之为MyUsers),但它仍然创建了AspNetUsers表。目标是用“MyUsers”表替换“AspNetUsers”表。请参阅下面的代码和创建的表的数据库图像。

      我实际上想用我自己的名字替换每个AspNet表...例如,MyRoles,MyUserClaims,MyUserLogins,MyUserRoles和MyUsers。

      如何完成此操作并最终只使用一组表格?

      public class ApplicationUser : IdentityUser
      {
          public string FirstName { get; set; }
          public string LastName { get; set; }
          public string Address1 { get; set; }
          public string Address2 { get; set; }
          public string City { get; set; }
          public string State { get; set; }
          public string PostalCode { get; set; }
          public string PhonePrimary { get; set; }
          public string PhoneSecondary { get; set; }
      }
      
      public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
      {
          public ApplicationDbContext(): base("DefaultConnection")
          {
          }
      
          protected override void OnModelCreating(DbModelBuilder modelBuilder)
          {
              base.OnModelCreating(modelBuilder);
              modelBuilder.Entity<IdentityUser>().ToTable("MyUsers");
          }
      }
      

      Database Tables

      - 更新答案 -

      感谢Hao Kung和Peter Stulinski。这解决了我的问题...

          protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
          {
              base.OnModelCreating(modelBuilder);
      
              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");
          }
      

7 个答案:

答案 0 :(得分:121)

您可以通过修改IdentityModel.cs轻松完成此操作:

在DbContext中覆盖OnModelCreating,然后添加以下内容,这会将AspNetUser表更改为“Users”,您还可以更改字段名称,默认Id列将成为User_Id。

modelBuilder.Entity<IdentityUser>()
                    .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");

或者如果您想保留所有标准列名,只需使用以下内容:

modelBuilder.Entity<IdentityUser>()
                        .ToTable("Users", "dbo")

下面的完整示例(这应该在您的IdentityModel.cs文件中)我将我的ApplicationUser类更改为User。

public class User : IdentityUser
    {
        public string PasswordOld { get; set; }
        public DateTime DateCreated { get; set; }

        public bool Activated { get; set; }

        public bool UserRole { get; set; }

    }

public class ApplicationDbContext : IdentityDbContext<User>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
            modelBuilder.Entity<User>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
        }
    }

请注意,如果当前表存在,我无法使其正常工作。另请注意,如果您没有映射任何列,则会创建默认列。

希望有所帮助。

答案 1 :(得分:55)

以下是我的工作解决方案:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder); // This needs to go before the other rules!

        modelBuilder.Entity<ApplicationUser>().ToTable("User");
        modelBuilder.Entity<IdentityRole>().ToTable("Role");
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRole");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin");
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

有关详细信息,请参阅this

答案 2 :(得分:15)

您可以尝试在DbContext类中重写此方法,将其映射到您选择的表中:

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<IdentityUser>()
            .ToTable("AspNetUsers");

答案 3 :(得分:2)

仅出于文档目的,对于未来几年来此帖子的人(例如XD),我评论中给出的所有答案都是正确的,但是您可以使用Alexandru Bucur给出的这种方法来简化在他的博客上

         //But this method is not longer supported on netcore > 2.2, so I need to fix it
         foreach (var entityType in modelBuilder.Model.GetEntityTypes())
         {
            var table = entityType.Relational().TableName;
             if (table.StartsWith("AspNet"))
             {
                 entityType.Relational().TableName = table.Substring(6);
             }
         };

        //This is the functional way on NetCore > 2.2
        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            var tableName = entityType.GetTableName();
            if (tableName.StartsWith("AspNet"))
            {
                entityType.SetTableName(tableName.Substring(6));
            }
        }

答案 4 :(得分:0)

我们可以像这样更改asp.net Identity默认表名:

    public class ApplicationDbContext : IdentityDbContext
    {    
        public ApplicationDbContext(): base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>().ToTable("user");
            modelBuilder.Entity<ApplicationUser>().ToTable("user");

            modelBuilder.Entity<IdentityRole>().ToTable("role");
            modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");
            modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("userlogin");
        }
    }

此外,我们可以扩展每个类,并将任何属性添加到类,例如“IdentityUser&#39;”,“IdentityRole&#39;”,...

    public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
    public ApplicationRole() 
    {
        this.Id = Guid.NewGuid().ToString();
    }

    public ApplicationRole(string name)
        : this()
    {
        this.Name = name;
    }

    // Add any custom Role properties/code here
}


// Must be expressed in terms of our custom types:
public class ApplicationDbContext 
    : IdentityDbContext<ApplicationUser, ApplicationRole, 
    string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    // Add additional items here as needed
}

为节省时间,我们可以使用AspNet Identity 2.0 Extensible Project Template扩展所有课程。

答案 5 :(得分:0)

您还可以创建配置类并指定每个Identity类的每个详细信息,例如:

using System.Data.Entity.ModelConfiguration;

public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
{
    public UserConfig()
    {
        ToTable("Users");
        Property(u => u.LocationName).IsRequired();
    }
}

然后在OnModelCreating()方法中包含这些配置:

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

        modelBuilder.Configurations.Add(new ApplicationUserConfig());
        ...
    }

这将使您可以完全控制Identity类的各个方面。

答案 6 :(得分:0)

但是它在.NET CORE(MVC 6)中不起作用,因为我们需要将绑定更改为

喜欢

protected override void OnModelCreating(ModelBuilder builder)
{
     builder.Entity<ApplicationRole>(entity =>
     {
         entity.ToTable(name:"Role");
         entity.Property(e => e.Id).HasColumnName("RoleId");

      });
}

这可能会帮助某人:)