作为实体框架迁移的一部分执行自定义SQL脚本
我一直在使用标准的添加迁移方法在实体框架上更新我的aspnet核心数据库。现在,我必须将两个“image”列移动到一个新表中(及其图像数据),从原始表中删除这些列,并在旧表和新表之间建立外键关系。我有一个SQL脚本来完成这一切 如何将此sql脚本作为正常EF迁移的一部分执行,并确保后续添加迁移更改将反映我的sql脚本所做的更改(添加新表/列,从原始表中删除图像列)?作为实体框架迁移的一部分执行自定义SQL脚本,sql,entity-framework-core,database-migration,entity-framework-migrations,Sql,Entity Framework Core,Database Migration,Entity Framework Migrations,我一直在使用标准的添加迁移方法在实体框架上更新我的aspnet核心数据库。现在,我必须将两个“image”列移动到一个新表中(及其图像数据),从原始表中删除这些列,并在旧表和新表之间建立外键关系。我有一个SQL脚本来完成这一切 如何将此sql脚本作为正常EF迁移的一部分执行,并确保后续添加迁移更改将反映我的sql脚本所做的更改(添加新表/列,从原始表中删除图像列)? 我已经看到了一些对SqlFile的引用和从DbMigration派生的引用,但是没有任何内容非常适合我的场景。我使用的是EF Co
我已经看到了一些对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");
}
protected override void Up(MigrationBuilder MigrationBuilder)
{
migrationBuilder.DropColumn(
名称:“MyExtraColumn”,
表:“MySuperTable”);
migrationBuilder.Sql(“DROP DATABASE[master]”;//移动已填充的、不可为空的列
获取实体框架以创建基本迁移,然后增强输出
将电子邮件地址
字段从旧表
移动到新表
的一些示例代码(MS SQL Server):
migrationBuilder.AddColumn(
名称:“电子邮件地址”,
表:“NewTable”,
默认值:“”);
migrationBuilder.Sql(“从NewTable.Id=OldTable.NewTableId上的NewTable JOIN OldTable更新NewTable SET NewTable.EmailAddress=OldTable.EmailAddress”);
migrationBuilder.AlterColumn(
名称:“电子邮件地址”,
表:“NewTable”,
可为空:false,
默认值:“”);
migrationBuilder.DropColumn(
名称:“电子邮件地址”,
表:“旧表”);
请记住,这需要在Up()
和Down()
中发生,除非Down()
撤消该操作。修改模型,生成迁移,然后编辑生成迁移的Up
方法,并在内部使用方法。如果您想要与SqlFile()等效,请使用类似于和的方法
,只需使用Sql(File.ReadAllText(“my.Sql”))
“在代码示例中删除数据库[master]”是残忍的:)我也喜欢危险的生活
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");