我们正在运行带有Code First和Migrations Enabled的Entity Framework 5。使用数据库初始化程序运行:MigrateToLatestVersion
我们有几个客户在最新的稳定分支上运行。当我们在主干/主服务器中开发新代码时,我们有时需要连接到在分支代码 fx 上运行的客户数据库。调试某种数据错误。
如果有人忘记切换到客户正在运行的分支,这可能是“危险的”,因为迁移将升级客户数据库以适应该人正在运行的任何代码。
一种解决方案是运行另一个不会迁移到最新版本的初始化程序。但是,当我们为新客户部署新系统或新加入团队并且需要启动并运行时,这将意味着更多的工作。
我们正在考虑通过在 app.config 中设置一个 bool 来设置代码是否应该“迁移到最新版本”,然后始终将其设置为 false 以进行开发,然后在部署给客户时对其进行转换来解决这个问题。
这样一来,我们仍然可以将数据库自动更新到最新版本,但不会有开发人员意外连接到旧版本代码系统以及迁移破坏该数据库的危险。
所以现在我们有了这个,我们基本上需要检查这个:
(简化代码)
if(Config.MigrateToLatestVersion || !databaseExists)
{
var initializer = new MigrateToLatestVersion<MyContext,MigrationConfiguration>();
Database.SetInitializer(initializer);
using(var context = new MyContext())
{
context.Database.Initialize(true)
}
}
我的问题是关于如何在不运行迁移的情况下检查数据库是否存在,但我发现你可以这样做:
Database.SetInitializer<MyContext>(null);
var context = new MyContext();
var databaseExists = context.Database.Exists();
但是,如果我只MigrateToLatestVersion
在数据库不存在或从包管理器控制台手动运行 Update-Database 时运行初始化程序。
我有两个问题,首先:如果我的模型与数据库不同,我不再收到异常,我仍然希望。第二:它不运行位于我的 MigrationConfiguration 中的种子方法,我可能仍想运行该方法。
关于我如何仍然可以运行 Migrations Initializer 以获得所有好处的任何建议,但仍然有一些东西可以防止有人意外破坏我们的生产环境?