我有一个多租户项目。因此,每个租户都有自己的数据库。
此项目首先是数据库,我将其更新为代码优先的解决方案。
现在,我已经按照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()
{
}
}
我将如何不为所有现有数据库运行该脚本,而是为新数据库运行?由于它们已经具有表,模式和种子数据。
免责声明:我尚未在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);
}