EF 4.3在一个数据库中使用多个DbContexts进行自动迁移

Joa*_*opf 21 entity-framework-4 ef-migrations

我正在尝试使用多个代码优先的DbContexts进行EF 4.3迁移.我的应用程序被分成几个插件,这些插件可能有关于其域的自己的DbContext.应用程序应该使用一个单独的sql-database.

当我尝试在空数据库中自动迁移上下文时,这仅对第一个上下文成功.每个其他上下文都需要将AutomaticMigrationDataLossAllowed-Property设置为true,然后尝试删除前一个的表.

所以我的问题是:

  • 如何判断迁移配置只是为了管理在相应上下文中定义的表并将所有其他表保留一个?
  • 在单个数据库中使用自动迁移处理多个DbContexts的正确工作流程是什么?

谢谢!

Anu*_*dey 32

这是你可以做的.非常简单.

您可以为每个上下文创建Configration类.例如

internal sealed class Configuration1 : DbMigrationsConfiguration<Context1>{
   public Configuration1 (){
        AutomaticMigrationsEnabled = false;
        MigrationsNamespace = "YourProject.Models.ContextNamespace1";
   }
}

internal sealed class Configuration2 : DbMigrationsConfiguration<Context2>{
   public Configuration2 (){
        AutomaticMigrationsEnabled = false;
        MigrationsNamespace = "YourProject.Models.ContextNamespace2";
   }
}
Run Code Online (Sandbox Code Playgroud)

现在添加迁移.您不需要启用迁移,因为您已经使用上面的2类.

Add-Migration -configuration Configuration1 Context1Init
Run Code Online (Sandbox Code Playgroud)

这将为context1创建迁移脚本.您可以再次为其他上下文重复此操作.

Add-Migration -configuration Configuration2 Context2Init
Run Code Online (Sandbox Code Playgroud)

更新数据库

Update-Database -configuration Configuration1
Update-Database -configuration Configuration2
Run Code Online (Sandbox Code Playgroud)

这可以按任何顺序完成.除非您需要确保按顺序调用每个配置.

  • 我的上帝应该将其标记为答案!!! 非常感谢!以防我在MVC 5和EF 6上使用此解决方案 (2认同)

bri*_*lam 6

Code First Migrations假定每个数据库只有一个迁移配置(每个配置一个上下文).

我可以想到两种可能的解决方案:

  1. 创建包含每个上下文的所有实体的聚合上下文,并从迁移配置类引用此"超级"上下文.这样,所有表都将在用户的数据库中创建,但数据只会在他们为其安装插件的数据中.

  2. 为每个上下文使用单独的数据库 如果您在上下文之间有共享实体,请添加自定义迁移并使用CreateTable(...)调用替换该调用以Sql("CREATE VIEW ...")从实体的"原始"数据库获取数据.

我会尝试#1,因为它将所有内容保存在一个数据库中.您可以在解决方案中创建一个单独的项目,以包含您的迁移和这个"超级"上下文.只需添加项目,引用所有插件项目,创建包含所有实体的上下文,然后在此新项目上调用Enable-Migrations.事情应该在那之后按预期工作.

  • 我接受这个答案,不管它是不是我的问题的答案.我认为将迁移设计为每个数据库只有一个上下文是错误的.一方面,每个具有未在上下文中使用的表的遗留数据库都会产生问题.另一方面(即使使用预编译视图)具有大约100个不同实体的上下文的app域需要很长时间才能开始.因此,将其分解为更小的上下文是目前唯一的解决方案. (5认同)
  • 我原来的答案已经过时了.EF 6.0删除了每个数据库的一个Code First上下文的限制.事情应该在6.0及更高版本中"正常工作". (3认同)