我一直在使用标准的添加迁移方法来更新实体框架上的 aspnet core 数据库。 我现在必须将两个“图像”列移动到新表(及其图像数据)中,从原始表中删除这些列,并在新旧表之间建立外键关系。 我有一个有效的 SQL 脚本来完成这一切。
如何执行此 sql 脚本作为正常 EF 迁移的一部分,并确保后续添加迁移更改将反映我的 sql 脚本将执行的更改(添加新表/列、从原始表中删除图像列)?
我已经看到了一些对 SqlFile 的引用以及从 DbMigration 派生的内容,但没有一个非常适合我的场景。 我使用的是 EF Core、aspnet core 2.0。
您可以编辑创建的迁移类(
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。
移动填充的、不可为空的列
获取实体框架来创建基础迁移,然后增强输出。
将
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()
会撤消操作。