C# 仅对新数据库运行迁移SQL脚本

C# 仅对新数据库运行迁移SQL脚本,c#,entity-framework,entity-framework-migrations,C#,Entity Framework,Entity Framework Migrations,我有一个多租户的项目。因此,每个租户都有自己的数据库 这个项目是数据库优先,我正在更新它,使之成为代码优先的解决方案 现在,我已经按照Microsoft Docs上的文档从现有数据库中反向构建了上下文/模型 我已经为所有现有数据库创建了一个空迁移。但由于用户可以创建应用程序的租户运行时,我需要为所有新数据库运行初始迁移 目前,我已经将初始数据库创建和初始种子数据移动到一个SQL文件中,并打算在初始迁移中调用此方法 像这样的 public partial class InitialCreate :

我有一个多租户的项目。因此,每个租户都有自己的数据库

这个项目是数据库优先,我正在更新它,使之成为代码优先的解决方案

现在,我已经按照Microsoft Docs上的文档从现有数据库中反向构建了上下文/模型

我已经为所有现有数据库创建了一个空迁移。但由于用户可以创建应用程序的租户运行时,我需要为所有新数据库运行初始迁移

目前,我已经将初始数据库创建和初始种子数据移动到一个SQL文件中,并打算在初始迁移中调用此方法

像这样的

public partial class InitialCreate : DbMigration
{
    public override void Up()
    {
        this.Sql(TBCompany_Scripts.CreateTBCompanyDB_TB5);
    }

    public override void Down()
    {

    }
}

如何跳过此脚本,使其不运行于所有现有数据库,而运行于新数据库?因为他们已经有了表、模式和种子数据。

免责声明:我没有在EF迁移中尝试过这种策略,但我已经成功地将其用于使用类似概念构建的自制迁移工具

由于您已经用SQL编写了初始的create代码,所以只需将该脚本设为幂等,这意味着您可以多次运行它而不会产生不良影响

从逻辑上讲,你想要的是

如果不存在,请从信息_SCHEMA.TABLES中选择1,其中TABLE_NAME='SomeTableFromYourSchema' 开始 -在这里创建您的模式 终止 如果测试表存在,迁移脚本将不起任何作用。如果不存在,脚本将创建模式。无论如何,EF都很高兴迁移已经完成

也就是说,条件sql可能很棘手。根据初始创建脚本的功能,使其幂等可能不像将其包装在if中那样简单。询问您最喜欢的搜索引擎有关幂等sql迁移的信息,以便深入了解

或者,如果您有办法在代码中知道是否需要创建模式,则可以将条件逻辑放入迁移类中

公共覆盖无效 { 如果是新数据库 SqlTBCompany_Scripts.CreateTBCompanyDB_TB5; }