执行自定义 SQL 脚本作为实体框架迁移的一部分

问题描述 投票:0回答:2

我一直在使用标准的添加迁移方法来更新实体框架上的 aspnet core 数据库。 我现在必须将两个“图像”列移动到新表(及其图像数据)中,从原始表中删除这些列,并在新旧表之间建立外键关系。 我有一个有效的 SQL 脚本来完成这一切。

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

我已经看到了一些对 SqlFile 的引用以及从 DbMigration 派生的内容,但没有一个非常适合我的场景。 我使用的是 EF Core、aspnet core 2.0。

sql entity-framework-core database-migration entity-framework-migrations
2个回答
39
投票

您可以编辑创建的迁移类(

Up
Down
方法)并在正确的位置包含您想要的任何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");
}

您有责任不“破坏”数据库架构(从 EntityFramework 的角度来看)并提供可靠的

Down
脚本以便能够多次向上/向下/向上/向下迁移。

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


18
投票

移动填充的、不可为空的列

获取实体框架来创建基础迁移,然后增强输出。

EmailAddress
字段从
OldTable
移动到
NewTable
(MS SQL Server) 的一些示例代码:

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()
会撤消操作。

© www.soinside.com 2019 - 2024. All rights reserved.