gpt4 book ai didi

c# - EF6 如何在禁用自动迁移时保留自定义 sql 生成器

转载 作者:太空狗 更新时间:2023-10-30 01:28:47 25 4
gpt4 key购买 nike

我们在我们的应用程序中使用 Entity Framework 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)
{
//
}
}

最佳答案

I could remove this and replace it with a different initializer (e.g. CreateDatabaseIfNotExists) but then the Configuration would not be used, because the constructor does not have a parameter for configuration

的确,您必须使用不同的初始值设定项。但结论是错误的。事实是,

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

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

如果您想知道为什么 MigrateDatabaseToLatestVersion 初始化程序需要配置参数,答案是 MigrateDatabaseToLatestVersion 是一个异常(exception)。

所有其他开箱即用的初始化程序都具有等效的公共(public) Database 类方法(或方法组合)。 MigrateDatabaseToLatestVersion 并非如此 - 它直接使用 DbMigrator 类并且可以选择忽略传递的上下文实例(不确定它的用例是什么),这需要传递 DbMigrationsConfigurationDbMigrator 构造函数 - source code .

关于c# - EF6 如何在禁用自动迁移时保留自定义 sql 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57253564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com