如何在使用Visual Studio 2013 ASP.NET标识时更改表名称?
我正在使用Visual Studio 2013的发行版本(RTM,不是RC)(从MSDN 2013-10-18下载),因此使用最新的(RTM)版本的AspNet.Identity。 当我创build一个新的Web项目,我select“个人用户帐户”进行身份validation。 这会创build下列表格:
- AspNetRoles
- AspNetUserClaims
- AspNetUserLogins
- AspNetUserRoles
- AspNetUsers
当我注册一个新用户(使用默认的模板)时,这些表(上面列出)被创build,并且AspNetUsers表有一个插入的logging,其中包含:
- ID
- 用户名
- PasswordHash
- SecurityStamp
- 鉴别
此外,通过将公共属性添加到“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类的每个方面。