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

问题描述 投票:1回答:1

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

此项目首先是数据库,我将其更新为代码优先的解决方案。

现在,我已经按照Microsoft Docs-https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/migrations/existing-database上的文档,对现有数据库的Context /模型进行了反向工程。

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

此刻,我已将初始数据库创建和初始种子数据移至SQL文件,并打算在初始迁移中将此方法称为。

这样的事情。

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

    public override void Down()
    {

    }
}

enter image description here

我将如何不为所有现有数据库运行该脚本,而是为新数据库运行?由于它们已经具有表,模式和种子数据。

c# entity-framework ef-migrations
1个回答
0
投票

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

由于您已经用SQL对初始创建进行了编码,因此只需要使该脚本具有幂等性-这意味着您可以多次运行它而不会产生不良影响。

逻辑上,您要的是类似...

if not exists (select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'SomeTableFromYourSchema')
begin
    -- create your schema here
end

如果测试表存在,则迁移脚本将不执行任何操作。如果不存在,脚本将创建模式。无论哪种方式,EF都很高兴迁移已经完成。

就是说,条件sql可能很棘手。根据您的“初始创建”脚本的功能,使其幂等可能并不像将其包装在if中那样简单。向您最喜欢的搜索引擎询问有关“幂等sql迁移”的内容,以进行更深入的研究。

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

public override void Up()
{
    if (IsNewDatabase())
        Sql(TBCompany_Scripts.CreateTBCompanyDB_TB5);
}
© www.soinside.com 2019 - 2024. All rights reserved.