【问题标题】:Execute custom SQL script as part of Entity Framework migration作为实体框架迁移的一部分执行自定义 SQL 脚本
【发布时间】:2018-03-20 04:29:06
【问题描述】:

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

如何在正常的 EF 迁移过程中执行此 sql 脚本,并确保后续添加迁移更改将反映我的 sql 脚本将执行的更改(添加新表/列,从原表)?

我看到了一些对 SqlFile 的引用并从 DbMigration 派生,但没有什么能很好地适合我的场景。我正在使用 EF Core、aspnet core 2.0。

【问题讨论】:

标签: sql entity-framework-core database-migration entity-framework-migrations


【解决方案1】:

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

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

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

【讨论】:

  • 而且,如果你想要 SqlFile() 的等价物,只需使用 Sql(File.ReadAllText("my.sql"))
  • "DROP DATABASE [master]" 在代码示例中是残酷的 :)
  • 我也喜欢危险的生活?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多