Identity 2.0代码首先自动迁移

时间:2014-07-18 14:59:15

标签: c# ef-code-first asp.net-identity ef-migrations claims-based-identity

在MVC应用程序VS 2013中使用Identity 2.0。我想扩展成员系统使用的一些内置表,并添加新表。前者运作良好。在IdentityModels.cs中,如果我向ApplicationUser添加一些新属性,则这些更改会自动迁移到AspNetUsers表。据我所知,这是由ApplicationDBContext的静态构造函数设置的,它继承自IdentityDbContext,DbInitializer基于DropCreateDatabaseIfModelChanges。因此,对ApplicationUser的任何更改都将导致数据库被删除并重新创建 - 正是我想要的。

什么也有效,虽然我不明白为什么,如果我想在ASPNetRoles表中添加一些东西,比如描述,我可以通过创建一个继承自IdentityRole的类来添加新的属性,并使用我的新Role子类将ApplicationRoleManager更改为wor。如果我在这个新类中进行任何更改,它们也会迁移到数据库。这是怎么发生的?它所增加的这个判别字段是什么?

我真正的问题是 - 我怀疑我不知道答案,因为我不确定这些其他迁移是如何工作的 - 如何将新表添加到Identity 2.0使用的标准5中 - 并且这些都是最初创建和迁移时更改?我是否必须使用包管理器并为这些新表添加迁移,或者我可以将其自动迁移到其他表中吗?

由于

1 个答案:

答案 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初始化程序,因此只要模型发生更改,就应擦除并更新数据库。