Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
作为实体框架迁移的一部分执行自定义SQL脚本_Sql_Entity Framework Core_Database Migration_Entity Framework Migrations - Fatal编程技术网

作为实体框架迁移的一部分执行自定义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

我一直在使用标准的添加迁移方法在实体框架上更新我的aspnet核心数据库。现在,我必须将两个“image”列移动到一个新表中(及其图像数据),从原始表中删除这些列,并在旧表和新表之间建立外键关系。我有一个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");
}
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");