首页 > 解决方案 > 使用实体框架在代码优先迁移中有条件地插入数据

问题描述

我正在尝试使用实体框架进行第二次迁移,到目前为止我生成了这样的代码

namespace Entity.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class LedgerDisplayOrder : DbMigration
    {
        public override void Up()
        {
            AddColumn("Ledgers", "DisplayOrder", c => c.Int());
            // Hic sunt leones
        }

        public override void Down()
        {
            DropColumn("Ledgers", "DisplayOrder");
        }
    }
}

如何填充此列的逻辑实际上非常简单,在 SQL 中它可能类似于以下内容:

ALTER TABLE [Ledgers] ADD [DisplayOrder] INT NULL;

UPDATE [Ledgers] 
SET DisplayOrder = 10 
WHERE [Id] = 26 OR [Id] = 27 OR [Id] = 23; 

UPDATE [Ledgers] 
SET DisplayOrder = 20 
WHERE [Id] = 29 OR [Id] = 9; 

UPDATE [Ledgers] 
SET DisplayOrder = 30 
WHERE [Id] = 28 OR [Id] = 23; 

换句话说,迁移应该在迁移过程中自动填充,但我不确定// hic sunt leones要实现这一点。我读到我应该使用migrationBuilder 类,可能类似于

migrationBuilder.InsertData(table: "ledger", column: "DisplayOrder", value: "10");

但是如何执行该WHERE条款?以及如何加载该类?我的 Visual Studio 的快速操作和重构 一直建议实现一个新类,所以我必须先安装一些东西吗?

任何帮助表示赞赏!

参考资料:到目前为止,我发现的只是为新列设置默认值。那不是我所追求的。

标签: c#asp.netentity-frameworkentity-framework-migrationscode-first

解决方案


您可以使用migrationBuilder.Sql命令在迁移期间执行纯 SQL 表达式:

而不是InsertData你可以使用

Sql("UPDATE [Ledgers] 
     SET DisplayOrder = 10 
     WHERE [Id] = 26 OR [Id] = 27 OR [Id] = 23; ");

migrationBuilder.Sql这是可以通过以下方式加载的缩写

using Microsoft.EntityFrameworkCore.Migrations;

如果您使用的是 EF Core 或(在您的情况下)通过

using System.Data.Entity.Migrations;

如果您使用的是 EntityFramework。


推荐阅读