是否可以使用 sql 文件作为 EF 数据库迁移?

Posted

技术标签:

【中文标题】是否可以使用 sql 文件作为 EF 数据库迁移?【英文标题】:is it possible to use sql files as EF database migrations? 【发布时间】:2016-01-03 03:00:44 【问题描述】:

我正在使用 EF6.0 并使用 SQLServerDatabaseProject 实现我的数据库。 我想使用 EF 迁移工具进行数据库迁移。但由于我在 DbProject 上有我的数据库,我希望我的所有迁移文件都是 SQLFiles(不是 c#) 所以我想知道 EF 是否支持此功能,如果不支持,是否可以编写一个新的 Migration 类来保留 EF 功能但以这种方式工作?

还请考虑我不希望 EF 生成我的迁移,但我希望能够使用其他迁移命令,例如 update-database 和 ...

==有关问题的更多详细信息==

我不想让 c# 类加载我的 sql 文件。必须直接保存 sql 文件以进行向上和向下迁移,并将其视为 DbMigration 类。 Migrations 目录的一个简单示例如下所示:

Migrations 
   -> up
       -> 201510060807125_alter-course-change-family.sql
       -> 201510060813136_alter-course-add-mark-column.sql
   -> down
       -> 201510060807125_alter-course-change-family.sql
       -> 201510060813136_alter-course-add-mark-column.sql

【问题讨论】:

【参考方案1】:

虽然您可以使用SqlFile 方法,但我建议您将其写在迁移文件夹中Configuration.cs 文件的Seed 方法上。

internal sealed class Configuration : DbMigrationConfiguration<YourDbContext>

    protected override void Seed(YourDbContext context)
    
        base.Seed(context);
        context.Database.ExecuteSqlCommand(FileReadAllText("migration.sql"));
    

如果您在 Up 方法中编写迁移。当您更新数据库时,它将在每次迁移时执行,我认为您不会期望。

您想要的是每个Update-Database 运行您的脚本。 (不是每个迁移)

【讨论】:

感谢答案,但我想知道是否可以使用 SQL 文件而不是 c# 类进行迁移【参考方案2】:

只需在迁移类中使用SqlFile扩展方法:

public partial class MyFancyMigration : DbMigration

    public override void Up()
    
        SqlFile("myUpSQLFile.sql");
    

    public override void Down()
    
        SqlFile("myDownSQLFile.sql");
    

【讨论】:

感谢您的回答,但我想知道是否可以使用 SQL 文件而不是 c# 类进行迁移。

以上是关于是否可以使用 sql 文件作为 EF 数据库迁移?的主要内容,如果未能解决你的问题,请参考以下文章

在.NET Core类库中使用EF Core迁移数据库到SQL Server

是否可以更改 EF 迁移“迁移”文件夹的位置?

如何使用 Docker 在 SQL Server 数据库上运行 EF Core 迁移?

EF6 Codefirst+MySql 数据库迁移

用 LINQ to SQL 或 LINQ to EF 替换 NHibernate

EF 迁移控制日志记录 SQL