【问题标题】:EF6 How do I retain a custom sql generator while disabling automatic migrationsEF6 如何在禁用自动迁移的同时保留自定义 sql 生成器
【发布时间】:2019-07-29 12:07:53
【问题描述】:

我们在应用程序中使用实体框架 6,以及在生成迁移时处理一些边缘情况的自定义 Sql Server 迁移生成器。

我们使用 add-migration 向系统添加新的迁移,然后在部署应用程序时,我们的部署工具运行 migrate.exe 以使用任何待处理的迁移更新目标数据库。

但是,我们发现迁移会自动应用到我们在运行应用程序时碰巧连接到的任何数据库。这对我们的应用程序来说是非常不受欢迎的行为。如果应用程序模型与其尝试连接的数据库不匹配,我们希望它无法工作。

我相信这是因为我们使用了以下内容:

// Supply configuration reference to Initializer
Database.SetInitializer(new MigrateDatabaseToLatestVersion<OurContext, OurDb.Migrations.Configuration>(useSuppliedContext: true));

我可以删除它并用不同的初始化程序(例如 CreateDatabaseIfNotExists)替换它,但随后不会使用配置,因为构造函数没有用于配置的参数:

// No opportunity to supply configuration?
Database.SetInitializer<OurDb>(new CreateDatabaseIfNotExists<OurDb>());

所以我的问题是,如何在禁用自动迁移的同时保留自定义 sql 生成器?

这是我们的 Configuration.cs 类的一部分:

internal sealed class Configuration : DbMigrationsConfiguration<OurDb>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = false;
        SetSqlGenerator("System.Data.SqlClient", new CustomSqlServerMigrationSqlGenerator());
    }

    protected override void Seed(OurDb context)
    {
        //
    }
}

【问题讨论】:

    标签: c# entity-framework-6 ef-code-first


    【解决方案1】:

    我可以删除它并将其替换为不同的初始化程序(例如CreateDatabaseIfNotExists),但随后将不会使用Configuration,因为构造函数没有用于配置的参数

    确实,您必须使用不同的初始化程序。但结论是错误的。事实是

    您的配置(连同自定义的MigrationSqlGenerator)将与任何预定义的初始化程序一起使用。

    他们没有用于配置的参数,因为他们根本不需要它。尽管未公开公开,但 EF6 数据库上下文可以访问其关联的迁移配置。否则,CreateCreateIfNotExists 等公共 Database 类方法将无法正常工作。

    如果你想知道为什么MigrateDatabaseToLatestVersion 初始化器需要配置参数,答案是MigrateDatabaseToLatestVersion 是一个例外。

    所有其他开箱即用的初始值设定项都具有等效的公共Database 类方法(或方法组合)。 MigrateDatabaseToLatestVersion 不是这样 - 它直接使用 DbMigrator 类,并且可以选择忽略传递的上下文实例(不确定用例是什么),这需要将 DbMigrationsConfiguration 传递给 DbMigrator 构造函数 - @ 987654324@.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 2016-08-03
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 2020-10-08
      相关资源
      最近更新 更多