如何开始在现有数据库集上使用 EF 代码优先迁移,同时还使用 LocalDB 进行测试
How to start using EF code first migrations on an existing set of databases whilst also using LocalDB for testing
我在一个系统上工作,该系统目前有许多环境(测试、阶段、现场等),每个环境都有自己的数据库。到目前为止,这些数据库已通过 运行 在每个数据库上使用相同的更新脚本保持同步。
我们现在开始使用 EF6 代码优先迁移,并且还想开始使用 LocalDB 编写一些自动化系统测试。
我发现 https://msdn.microsoft.com/pt-pt/data/dn579398 描述了添加初始迁移的两个选项。
第一种方法创建一个空的初始迁移,这对现有环境非常有用,但无助于创建用于测试的 LocalDB。
第二种方法创建一个迁移以从头开始启动整个数据库(减去 EF 不关心的东西,例如存储过程和视图)。这将是 acceptable 用于测试,但不利于实际重新创建数据库。还需要你手动注释掉Up方法,运行在所有现有数据库上迁移,然后把Up方法放回去。因为在所有环境中完成迁移需要一段时间,所以我不热衷于此。它还违反了迁移的原则之一,即一旦发布就不应对其进行编辑。
在迁移中有某种条件可以解决我的问题(例如 if(tableExists("A_table_in_the_existing_database") return;)但似乎没有类似的东西可用。
我想出的最好办法是将现有数据库模式从 SQL 服务器转储到一个文件(其优点是保留存储过程、视图等),然后使用上面的选项 2,除了不使用生成的 Up 方法,我将 运行 SQL 文件。
但是,这仍然有上面提到的选项 2 的缺点,所以我很乐意学习处理这种情况的更好方法。
编辑:
这行得通吗? 运行 在一个数据库上注释掉初始迁移,然后转储 __MigrationHistory table 并将其插入到其他数据库中?这样我就不必等待迁移通过所有环境,然后才能安全地取消注释。
EF 6.1.2 支持 运行ning SQL 作为资源嵌入到包含使用 SqlResource 方法的迁移的程序集中。
我想我会编写现有模式的脚本并使用执行 SqlResource
作为其 Up
的初始迁移。如果它所做的只是一堆 IF EXISTS
,那么 运行 应该不会花太长时间。否则,如果您只想在本地 运行 一次并手动应用于所有其他数据库,那么编写 __MigrationHistory
脚本也可以。
我在一个系统上工作,该系统目前有许多环境(测试、阶段、现场等),每个环境都有自己的数据库。到目前为止,这些数据库已通过 运行 在每个数据库上使用相同的更新脚本保持同步。
我们现在开始使用 EF6 代码优先迁移,并且还想开始使用 LocalDB 编写一些自动化系统测试。
我发现 https://msdn.microsoft.com/pt-pt/data/dn579398 描述了添加初始迁移的两个选项。
第一种方法创建一个空的初始迁移,这对现有环境非常有用,但无助于创建用于测试的 LocalDB。
第二种方法创建一个迁移以从头开始启动整个数据库(减去 EF 不关心的东西,例如存储过程和视图)。这将是 acceptable 用于测试,但不利于实际重新创建数据库。还需要你手动注释掉Up方法,运行在所有现有数据库上迁移,然后把Up方法放回去。因为在所有环境中完成迁移需要一段时间,所以我不热衷于此。它还违反了迁移的原则之一,即一旦发布就不应对其进行编辑。
在迁移中有某种条件可以解决我的问题(例如 if(tableExists("A_table_in_the_existing_database") return;)但似乎没有类似的东西可用。
我想出的最好办法是将现有数据库模式从 SQL 服务器转储到一个文件(其优点是保留存储过程、视图等),然后使用上面的选项 2,除了不使用生成的 Up 方法,我将 运行 SQL 文件。
但是,这仍然有上面提到的选项 2 的缺点,所以我很乐意学习处理这种情况的更好方法。
编辑: 这行得通吗? 运行 在一个数据库上注释掉初始迁移,然后转储 __MigrationHistory table 并将其插入到其他数据库中?这样我就不必等待迁移通过所有环境,然后才能安全地取消注释。
EF 6.1.2 支持 运行ning SQL 作为资源嵌入到包含使用 SqlResource 方法的迁移的程序集中。
我想我会编写现有模式的脚本并使用执行 SqlResource
作为其 Up
的初始迁移。如果它所做的只是一堆 IF EXISTS
,那么 运行 应该不会花太长时间。否则,如果您只想在本地 运行 一次并手动应用于所有其他数据库,那么编写 __MigrationHistory
脚本也可以。