我一直在使用标准的添加迁移方法来更新我的实体框架上的aspnet核心数据库。我现在必须将两个“图像”列移动到一个新表(及其图像数据)中,从原始表中删除列,并在旧表和新表之间设置外键关系。我有一个可用的SQL脚本来完成这一切。
如何在正常的EF迁移过程中执行此sql脚本,并确保后续的添加迁移更改将反映我的sql脚本将执行的更改(添加新的表/列,从中删除图像列)原表)?
我已经看过一些对SqlFile的引用并从DbMigration派生,但没有什么能很好地适应我的场景。我正在使用EF Core,aspnet core 2.0。
答案 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)
您可以编辑已创建的迁移类(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");
}
你的责任不是&#34;打破&#34;数据库模式(在EntityFramework的观点中)并提供可靠的Down
脚本,以便能够多次向上/向下/向上/向下迁移。
另外,如果要删除迁移并重新添加,请不要再忘记重新添加SQL。