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

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

我知道可以创建多个不相关的DbContext,并在同一数据库中启用自动迁移,这是因为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; }
}

最佳答案

ojita描述了一种非常相似的场景:让客户在上下文中添加/编辑用户定义的列或表。

关于c# - 在同一数据库中具有从基础DbContext进行多次迁移和继承的 Entity Framework ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22943043/

10-12 02:42
查看更多