作为Entity Framework迁移

时间:2017-10-09 03:23:03

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

<?php $p = new myClass(); $p->run(); 字段从 EmailAddress 移动到 OldTable 的一些示例代码(MS SQL Server):

NewTable

请记住,这需要对 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() 撤消操作。

答案 1 :(得分:5)

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

你的责任不是&#34;打破&#34;数据库模式(在EntityFramework的观点中)并提供可靠的Down脚本,以便能够多次向上/向下/向上/向下迁移。

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