Entity framework 如何在现有数据库集上开始使用EF代码优先迁移,同时也使用LocalDB进行测试

Entity framework 如何在现有数据库集上开始使用EF代码优先迁移,同时也使用LocalDB进行测试,entity-framework,entity-framework-migrations,localdb,Entity Framework,Entity Framework Migrations,Localdb,我正在开发一个系统,该系统目前有许多环境(测试、阶段、现场等),每个环境都有自己的数据库。到目前为止,通过在每个数据库上运行相同的更新脚本,这些数据库一直保持同步 我们现在开始使用EF6代码优先迁移,并希望开始使用LocalDB编写一些自动化系统测试 我发现它描述了添加初始迁移的两个选项 第一种方法创建一个空的初始迁移,这对现有环境非常有用,但无助于创建用于测试的LocalDBs 第二种方法创建一个迁移,从零开始运行整个数据库(减去EF不关心的东西,如存储过程和视图)。这对于测试来说是可以接受的

我正在开发一个系统,该系统目前有许多环境(测试、阶段、现场等),每个环境都有自己的数据库。到目前为止,通过在每个数据库上运行相同的更新脚本,这些数据库一直保持同步

我们现在开始使用EF6代码优先迁移,并希望开始使用LocalDB编写一些自动化系统测试

我发现它描述了添加初始迁移的两个选项

第一种方法创建一个空的初始迁移,这对现有环境非常有用,但无助于创建用于测试的LocalDBs

第二种方法创建一个迁移,从零开始运行整个数据库(减去EF不关心的东西,如存储过程和视图)。这对于测试来说是可以接受的,但对于实际重新创建数据库来说并不好。它还要求您手动注释掉Up方法,在所有现有数据库上运行迁移,然后重新放置Up方法。因为在所有环境中进行迁移需要一段时间,所以我对此不感兴趣。它还违反了迁移的一个原则,即一旦发布,就不应对其进行编辑

在迁移中设置某种条件可以解决我的问题(例如,如果(tableExists(“A_table\u in_the_existing_database”)return;),但似乎没有类似的东西可用

我想到的最好方法是将现有的数据库模式从SQL server转储到一个文件中(这具有保留存储过程、视图等的优点),然后使用上面的选项2,除非我将运行SQL文件而不是使用生成的up方法

然而,这仍然有上面提到的选项2的缺点,所以我很高兴知道更好的方法来处理这种情况

编辑:
这行吗?在一个数据库上运行注释掉的初始迁移,然后转储uu MigrationHistory表并将其插入到其他数据库中?这样我就不必等待迁移通过所有环境,然后才能安全地取消注释。

EF 6.1.2支持将SQL嵌入作为重新注释运行包含使用方法进行迁移的程序集中的源


我想我应该用脚本编写出您现有的模式,并使用一个初始迁移来执行
SqlResource
作为它的
Up
。如果它所做的只是一堆
If EXISTS
,那么运行它应该不会花费太长时间。否则,如果您只想运行一次,脚本编写出
\u MigrationHistory
也会起作用本地并手动应用于所有其他数据库。

谢谢,嵌入脚本听起来是个好主意。脚本实际上很长,包含许多单独的批处理,因此我真的希望使用一个测试来完成所有或什么都不做。编写脚本u MigrationHistory可能是一个不错的选择。