如何使用int ID列更改ASP.net Identity 2.0的表名?
我已经使用了多年的ASP.net会员资格,刚刚开始尝试ASP.net身份。 他们刚刚发布了2.0版本,应该支持int
主键。 我已经定义了我的自定义标识类如下,以获得整数主键支持:
public class User : IdentityUser<int, UserLogin, UserRole, UserClaim> { } public class UserLogin : IdentityUserLogin<int> { } public class Role : IdentityRole<int, UserRole> { public string Description { get; set; } // Custom description field on roles } public class UserRole : IdentityUserRole<int> { } public class UserClaim : IdentityUserClaim<int> { } public class MyDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim> { public MyDbContext() : this("MyDB") { } public MyDbContext(string connStringName) : base(connStringName) { this.Configuration.LazyLoadingEnabled = false; this.Configuration.ProxyCreationEnabled = false; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<User>().ToTable("Users"); modelBuilder.Entity<Role>().ToTable("Roles"); modelBuilder.Entity<UserRole>().ToTable("UserRoles"); modelBuilder.Entity<UserLogin>().ToTable("UserLogins"); modelBuilder.Entity<UserClaim>().ToTable("UserClaims"); base.OnModelCreating(modelBuilder); } }
当我创build数据库迁移时,它会为每个标识表正确地创build一个整数Id列,但是,它将忽略在OnModelCreating
方法中指定的自定义表名。 相反,我得到像dbo.AspNetUsers
和dbo.AspNetRoles
这样的表名。
我也尝试添加[Table("TableName")]
到我的自定义标识类,它没有任何效果。
在查看ASP.net Identity 1.0的示例时,看起来他们重复使用基本Identity类的每个modelBuilder.Entry<Type>().ToTable("TableName")
行:
modelBuilder.Entity<User>().ToTable("Users"); modelBuilder.Entity<IdentityUser<int, IdentityUserLogin<int>, IdentityUserRole<int>, IdentityUserClaim<int>>>().ToTable("Users"); modelBuilder.Entity<Role>().ToTable("Roles"); modelBuilder.Entity<IdentityRole<int, UserRole>>().ToTable("Roles"); modelBuilder.Entity<UserRole>().ToTable("UserRoles"); modelBuilder.Entity<IdentityUserRole<int>>().ToTable("UserRoles"); modelBuilder.Entity<UserLogin>().ToTable("UserLogins"); modelBuilder.Entity<IdentityUserLogin<int>>().ToTable("UserLogins"); modelBuilder.Entity<UserClaim>().ToTable("UserClaims"); modelBuilder.Entity<IdentityUserClaim<int>>().ToTable("UserClaims");
但是,我尝试了几个变化,我的迁移不会产生。 我不断收到错误类似Microsoft.AspNet.Identity.EntityFramework.IdentityUser'4 [System.Int32,Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin'1 [System.Int32],Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole '1 [System.Int32],Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim'1 [System.Int32]]'未映射。 通过使用Ignore方法或NotMappedAttribute数据注释来检查types是否未被明确排除。 validationtypes被定义为一个类,不是原始的或通用的,并且不从EntityObjectinheritance。
如何在ASP.net Identity 2.0中使用整数主键生成自定义表名?
Grrr ……所以在浪费了几个小时之后,我复制了我的规则,并将它们粘贴到了base.OnModelCreating(modelBuilder);
行和一切正常工作。 我没有意识到,基本的方法需要被称为第一:(
现在使用以下configuration一切正常工作:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // This needs to go before the other rules! modelBuilder.Entity<User>().ToTable("Users"); modelBuilder.Entity<Role>().ToTable("Roles"); modelBuilder.Entity<UserRole>().ToTable("UserRoles"); modelBuilder.Entity<UserLogin>().ToTable("UserLogins"); modelBuilder.Entity<UserClaim>().ToTable("UserClaims"); }
在IdentityModel.cs文件中,我将下面的代码添加到ApplicationDbContext
类
请注意,模型名称与接受答案中列出的名称不同
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<ApplicationUser>().ToTable("SystemUsers"); modelBuilder.Entity<IdentityRole>().ToTable("SystemRoles"); modelBuilder.Entity<IdentityUserRole>().ToTable("SystemUserRoles"); modelBuilder.Entity<IdentityUserLogin>().ToTable("SystemUserLogins"); modelBuilder.Entity<IdentityUserClaim>().ToTable("SystemUserClaims"); }