实体框架,具有从同一数据库中的基本DbContexts进行的多次迁移和继承

时间:2014-04-08 16:34:16

标签: c# entity-framework ef-migrations

我正在构建一个可扩展的自定义CMS解决方案,其中我有一个名为CmsDbContext的父DbContext,其中包含CMS表的实体,例如:Users表。 CmsDbContext启用了自动迁移。 我希望允许最终用户从CmsDbContext继承,以便通过添加/映射DbSet属性和自定义POCO来创建自定义的额外表/实体。

Cms需要在导出的DbContext初始化之前在PreStart中初始化他的CmsDbContext。 到目前为止一切顺利,当我初始化CmsDbContext时,表是成功创建的。 当我初始化派生的DbContext时,例如CustomCmsDbContext,成功创建了额外的表。但是,当重新启动Web应用程序时,CmsDbContext的迁移过程将擦除不属于上下文的表,并重新创建继承的CustomDbContext的表。

我知道在同一个数据库中启用自动迁移可以创建多个不相关的DbContexts,因为DbMigrationsConfiguration的ContextKey属性会。但我需要继承这里,以便允许CustomCmsDbContext上下文对CmsDbContext映射的现有表进行查询,因此两个上下文的行为类似于一个DbContext,并启用了迁移。

所以我们知道问题是父DbContext在迁移过程中删除了子DbContext的表,子DbContext在迁移过程中重新创建了丢失的表。

如何避免迁移删除不属于DbContext的表?

这是伪代码:

public class CmsDbContext: DbContext {

    static CmdDbContext() {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<CmsDbContext, Migrations.CmsDbContextConfiguration>());
    }

    public DbSet<User> Users { get; set; }
}


public class CustomCmdDbContext: CmsDbContext {

    static CustomCmdDbContext() {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<CustomCmdDbContext, Migrations.CustomCmdDbContext>());
    }
    public DbSet<CustomEntity> CustomEntities { get; set; }
}

1 个答案:

答案 0 :(得分:3)

This blog post from Rowan Miller描述了一个非常类似的场景:让客户在上下文中添加/编辑用户定义的列或表。