作为 Entity Framework 迁移的一部分执行自定义 SQL 脚本

Execute custom SQL script as part of Entity Framework migration

我一直在使用标准的添加-迁移方法在 Entity Framework 上更新我的 aspnet 核心数据库。我现在必须将两个 "image" 列移动到一个新的 table 中(及其图像数据),从原来的 table 中删除这些列,并在旧的和新 tables。我有一个有效的 SQL 脚本来完成这一切。

如何将此 sql 脚本作为正常 EF 迁移的一部分执行,并确保后续的添加迁移更改将反映我的 sql 脚本将进行的更改做(添加新 table/columns,从原始 table 中删除图像列)?

我看到了一些对 SqlFile 的引用和从 DbMigration 派生的,但没有一个非常适合我的场景。我正在使用 EF Core、aspnet core 2.0。

您可以编辑创建的迁移 class(UpDown 方法)并在正确的位置包含您想要的任何 SQL:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropColumn(
        name: "MyExtraColumn",
        table: "MySuperTable");

    migrationBuilder.Sql("DROP DATABASE [master]"); // <<< Anything you want :)

    migrationBuilder.DropColumn(
        name: "MyExtraColumn2",
        table: "MySuperTable");
}

您有责任不要 "break" 数据库模式(从 EntityFramework 的角度)并提供可靠的 Down 脚本以便能够迁移 up/down/up/down 多个次。

此外,如果您要删除迁移并重新添加它,请不要忘记再次重新添加 SQLs。

移动填充的非空列

获取 Entity Framework 创建基础迁移,然后增强输出。

一些示例代码将 EmailAddress 字段从 OldTable 移动到 NewTable(MS SQL 服务器):

migrationBuilder.AddColumn<string>(
    name: "EmailAddress",
    table: "NewTable",
    defaultValue: "");

migrationBuilder.Sql("UPDATE NewTable SET NewTable.EmailAddress = OldTable.EmailAddress FROM NewTable JOIN OldTable ON NewTable.Id = OldTable.NewTableId");

migrationBuilder.AlterColumn<string>(
    name: "EmailAddress",
    table: "NewTable",
    nullable: false,
    defaultValue: "");

migrationBuilder.DropColumn(
    name: "EmailAddress",
    table: "OldTable");

请记住,这需要发生在 Up()Down() 上,除了 Down() 撤消操作。