在实体框架迁移中执行自定义SQL脚本

pau*_*guy 2 sql database-migration ef-migrations entity-framework-core

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

在正常的EF迁移中,如何执行此sql脚本,并确保后续的add-migration更改将反映我的sql脚本将进行的更改(添加新表/列,从原始表中删除图像列)?

我已经看到了一些对SqlFile的引用,这些引用是从DbMigration派生的,但是没有任何一个适合我的情况。我正在使用EF Core,aspnet core 2.0。

Pet*_*r L 9

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

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

EmailAddress字段从OldTableNewTable(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");
Run Code Online (Sandbox Code Playgroud)

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


Dmi*_*try 8

您可以编辑创建的迁移类(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");
}
Run Code Online (Sandbox Code Playgroud)

您的责任是不要“破坏”数据库架构(从EntityFramework的角度来看),并提供可靠的Down脚本以能够向上/向下/向上/向下迁移多次。

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

  • 代码示例中的“ DROP DATABASE [master]”是残酷的:) (6认同)
  • 而且,如果您想要“SqlFile()”的等效项,只需使用“Sql(File.ReadAllText("my.sql"))”即可。 (2认同)
  • 我也喜欢危险的生活 (2认同)