如何将自定义表结构的ASP.NET标识用作User
(UserId
,Password
)和UserRole
(UserId,IsAdmin,IsNormalUser,IsManager
)
使用MVC 5?
我不想使用所有默认表格,例如AspNetUsers
,AspNetRoles
,AspNetUserClaims
,AspNetUserRoles
,AspNetUserLogins
?
答案 0 :(得分:1)
使用OnModelCreating事件将表和/或列映射到您自己的架构,就像我在this StackOverflow question中所做的那样。
这看起来像 -
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var user = modelBuilder.Entity<IdentityUser>().HasKey(u => u.Id).ToTable("User", "Users"); //Specify our our own table names instead of the defaults
user.Property(iu => iu.Id).HasColumnName("UserId");
user.Property(iu => iu.UserName).HasColumnName("UserName");
user.Property(iu => iu.PasswordHash).HasColumnName("Password");
user.Ignore(iu => iu.Email);
user.Ignore(iu => iu.EmailConfirmed);
user.Ignore(iu => iu.PhoneNumber);
user.Ignore(iu => iu.PhoneNumberConfirmed);
user.Ignore(iu => iu.AccessFailedCount);
user.Ignore(iu => iu.LockoutEnabled);
user.Ignore(iu => iu.LockoutEndDateUtc);
user.Ignore(iu => iu.SecurityStamp);
user.Ignore(iu => iu.TwoFactorEnabled);
user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
user.Ignore(iu => iu.Logins);
user.Ignore(iu => iu.Claims);
modelBuilder.Ignore<IdentityUserClaim)();
modelBuilder.Ignore<IdentityUserLogin>();
...
}
这里的流畅API的关键部分是ToTable([TableName], [SchemaName])和HasColumnName([ColumnName])
这可以适用于使用标准Entity Framework Code First为您创建表,或映射到现有数据库或使用SQL脚本手动创建的数据库。
有关Code First(包括Fluent API映射)的更多信息,请参阅Code First to a New Database
由于您希望忽略DbContext类的属性并排除某些DbContext类完全映射,因此您需要将.Ignore() extension method用于未映射的属性,并将.Ignore<T>() extension method用于类的模型构建器
这些属性(和集合)仍将存在于内存中,但不会持久保存到数据库中。