在MVC应用程序VS 2013中使用Identity 2.0。我想扩展成员系统使用的一些内置表,并添加新表。前者运作良好。在IdentityModels.cs中,如果我向ApplicationUser添加一些新属性,则这些更改会自动迁移到AspNetUsers表。据我所知,这是由ApplicationDBContext的静态构造函数设置的,它继承自IdentityDbContext,DbInitializer基于DropCreateDatabaseIfModelChanges。因此,对ApplicationUser的任何更改都将导致数据库被删除并重新创建 - 正是我想要的。
什么也有效,虽然我不明白为什么,如果我想在ASPNetRoles表中添加一些东西,比如描述,我可以通过创建一个继承自IdentityRole的类来添加新的属性,并使用我的新Role子类将ApplicationRoleManager更改为wor。如果我在这个新类中进行任何更改,它们也会迁移到数据库。这是怎么发生的?它所增加的这个判别字段是什么?
我真正的问题是 - 我怀疑我不知道答案,因为我不确定这些其他迁移是如何工作的 - 如何将新表添加到Identity 2.0使用的标准5中 - 并且这些都是最初创建和迁移时更改?我是否必须使用包管理器并为这些新表添加迁移,或者我可以将其自动迁移到其他表中吗?
由于
雷
答案 0 :(得分:1)
如果您使用对象浏览器查看课程IdentityDbContext<TUser, TRole, TKey, TUserLogin, TUserRole, TUserClaim>
,则可以看到它有IDbSet<TRole> Roles
。您传递给ApplicationRoleManager
的角色类型会流向此处,以及EF了解您的新课程的方式。
Discriminator列是EF默认情况下在使用每层结构(TPH)时创建的。它使EF能够区分存储在同一个表中的不同类型。
要将表格添加到ApplicationDbContext
,您只需为其创建DbSet
即可。例如......
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
Database.SetInitializer<ApplicationDbContext>(new DropCreateDatabaseIfModelChanges<ApplicationDbContext>());
}
public DbSet<Product> Products { get; set; }
public DbSet<Order> Orders { get; set; }
}
由于使用了DropCreateDatabaseIfModelChanges
初始化程序,因此只要模型发生更改,就应擦除并更新数据库。