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

我正在使用Visual Studio 2013的发行版本(RTM,不是RC)(从MSDN 2013-10-18下载),因此使用最新的(RTM)版本的AspNet.Identity。 当我创build一个新的Web项目,我select“个人用户帐户”进行身份validation。 这会创build下列表格:

  1. AspNetRoles
  2. AspNetUserClaims
  3. AspNetUserLogins
  4. AspNetUserRoles
  5. AspNetUsers

当我注册一个新用户(使用默认的模板)时,这些表(上面列出)被创build,并且AspNetUsers表有一个插入的logging,其中包含:

  1. ID
  2. 用户名
  3. PasswordHash
  4. SecurityStamp
  5. 鉴别

此外,通过将公共属性添加到“ApplicationUser”类中,我已成功向AspNetUsers表中添加了其他字段,例如“FirstName”,“LastName”,“PhoneNumber”等。

这是我的问题。 有没有办法改变上面表格的名字(当它们是第一次创build的时候),还是总是用上面列出的AspNet前缀命名? 如果表名可以命名不同,请解释如何。

– 更新 –

我实施了@Hao Kung的解决scheme。 它确实创build了一个新表(例如我称之为MyUsers),但它也创build了AspNetUsers表。 目标是用“MyUsers”表replace“AspNetUsers”表。 查看下面的代码和创build的表的数据库图像。

我实际上想用我自己的名字replace每个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"); } } 

数据库表

– 更新答案 –

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

您可以通过修改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类被称为用户。

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

请注意,如果当前表存在,我还没有设法得到这个工作。 还要注意,不会映射默认列的任何列都将被创build。

希望有所帮助。

以下是我的工作解决scheme:

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

看到这个更多的细节

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

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

我们可以像这样改变asp.net标识的默认表名:

  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”,“IdentityRole”,…

  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来扩展所有的类。

您还可以创buildconfiguration类并指定每个Identity类的每个细节,例如:

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

然后将这些configuration包含在OnModelCreating()方法中:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Configurations.Add(new ApplicationUserConfig()); ... } 

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