我有一个新的MVC5项目,包含ASP.NET Identity 2.0和EF 6.1.1。
我添加了自己的ApplicationUser(基于内置的IdentityUser)。这就是我的DbContext的创建方式。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
创建数据库时,我有AspNetUsers,AspNetUserRoles,AspNetUserClaims和AspNetUserLogins等表。然后我用最基本的语句添加了OnModelCreating()。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}
只要我添加OnModelCreating(),身份表就会自动重命名为ApplicationUsers,IdentityUserRoles,IdentityUserClaims和IdentityUserLogins。这对我很好(我知道如何重命名)。
但我不喜欢:突然之间,IdentityUserRoles,IdentityUserClaims和IdentityUserLogins有一个额外的字段,名为&#34; ApplicationUser_Id&#34 ;。原版&#34; AspNetXXX&#34;桌子没有这样的场地。
为什么?为了避免这种情况,我能做些什么吗?
答案 0 :(得分:2)
您需要致电base.OnModelCreating
。 OnModelCreating
中IdentityDbContext
还有许多额外的事情,你可能会在没有调用它的情况下丢失它们 - 表的默认名称就是其中之一。
最好先调用它,然后再应用自己的更改。
答案 1 :(得分:1)
也为我工作,谢谢你。
public class NebulaContext : IdentityDbContext<ApplicationUser>
{
public NebulaContext()
: base("Name=MyEntity", throwIfV1Schema: false)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); //Optional
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();//Optional
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); //Optional
base.OnModelCreating(modelBuilder);
}
}