c# - 使用实体框架在代码优先迁移中有条件地插入数据
问题描述
我正在尝试使用实体框架进行第二次迁移,到目前为止我生成了这样的代码
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 的快速操作和重构 一直建议实现一个新类,所以我必须先安装一些东西吗?
任何帮助表示赞赏!
参考资料:到目前为止,我发现的只是为新列设置默认值。那不是我所追求的。
解决方案
您可以使用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。
推荐阅读
- java - Comparator 是一个类还是一个接口,如果是后者,它是如何被实例化的?
- excel - Selenium Basic VBA - Base64 的屏幕截图
- bash - 超过 n 天的 Tar 文件
- java - 8u201:方法引用抛出 IAE,而 lambda 传递包私有参数
- python - 过滤字段域 one2many to many2one
- regex - 只替换1个前导零,如果超过1次则丢弃它
- python - 重命名 DRF 序列化器字段
- java - AndroidStudio - 将用户信息保存在 CSV 文件中并读取
- google-chrome - Pixel Slate 上的无效清单(Chrome 操作系统)
- azure-cognitive-search - 如何过滤自动完成