作为 Entity Framework 迁移的一部分执行自定义 SQL 脚本
Execute custom SQL script as part of Entity Framework migration
我一直在使用标准的添加-迁移方法在 Entity Framework 上更新我的 aspnet 核心数据库。我现在必须将两个 "image" 列移动到一个新的 table 中(及其图像数据),从原来的 table 中删除这些列,并在旧的和新 tables。我有一个有效的 SQL 脚本来完成这一切。
如何将此 sql 脚本作为正常 EF 迁移的一部分执行,并确保后续的添加迁移更改将反映我的 sql 脚本将进行的更改做(添加新 table/columns,从原始 table 中删除图像列)?
我看到了一些对 SqlFile 的引用和从 DbMigration 派生的,但没有一个非常适合我的场景。我正在使用 EF Core、aspnet core 2.0。
您可以编辑创建的迁移 class(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");
}
您有责任不要 "break" 数据库模式(从 EntityFramework 的角度)并提供可靠的 Down
脚本以便能够迁移 up/down/up/down 多个次。
此外,如果您要删除迁移并重新添加它,请不要忘记再次重新添加 SQLs。
移动填充的非空列
获取 Entity Framework 创建基础迁移,然后增强输出。
一些示例代码将 EmailAddress
字段从 OldTable
移动到 NewTable
(MS SQL 服务器):
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()
撤消操作。
我一直在使用标准的添加-迁移方法在 Entity Framework 上更新我的 aspnet 核心数据库。我现在必须将两个 "image" 列移动到一个新的 table 中(及其图像数据),从原来的 table 中删除这些列,并在旧的和新 tables。我有一个有效的 SQL 脚本来完成这一切。
如何将此 sql 脚本作为正常 EF 迁移的一部分执行,并确保后续的添加迁移更改将反映我的 sql 脚本将进行的更改做(添加新 table/columns,从原始 table 中删除图像列)?
我看到了一些对 SqlFile 的引用和从 DbMigration 派生的,但没有一个非常适合我的场景。我正在使用 EF Core、aspnet core 2.0。
您可以编辑创建的迁移 class(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");
}
您有责任不要 "break" 数据库模式(从 EntityFramework 的角度)并提供可靠的 Down
脚本以便能够迁移 up/down/up/down 多个次。
此外,如果您要删除迁移并重新添加它,请不要忘记再次重新添加 SQLs。
移动填充的非空列
获取 Entity Framework 创建基础迁移,然后增强输出。
一些示例代码将 EmailAddress
字段从 OldTable
移动到 NewTable
(MS SQL 服务器):
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()
撤消操作。