0

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

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

我见过一些SqlFile的引用,并从DbMigration派生,但没有什么符合我的场景很好。我正在使用EF Core,aspnet核心2.0。

+0

修改模型,生成迁移,然后编辑生成的迁移的Up方法并使用['Sql'](https://docs.microsoft.com/en-us/ef/core/api /microsoft.entityframeworkcore.migrations.migrationbuilder#Microsoft_EntityFrameworkCore_Migrations_MigrationBuilder_Sql_System_String_System_Boolean_)方法里面。类似于[在EF Core中添加一对一关系时迁移数据?](https://stackoverflow.com/questions/42811193/migrating-data-when-adding-one-to-one-relationship-in- ef-core/42867561#42867561) –

回答

1

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

这是你的责任,不“破发”的数据库模式(在视图的EntityFramework点)并提供可靠的Down脚本,以便能够多次向上/向下/向上/向下迁移。

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

+0

而且,如果您想要相当于'SqlFile()',只需使用'Sql(File.ReadAllText(“my.sql”))''。 – bricelam