You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EF Core中通过列表指定类属性进行批量更新(C#)

EF Core 多字段批量更新+变更日志实现方案

问题背景

使用Entity Framework Core操作Artikel实体(对应数据库Artikel表),原有代码仅支持单字段更新并同步记录变更日志,现在需要扩展为多字段批量更新,避免重复编写相似代码,已尝试通过反射获取实体属性,但不清楚如何通过反射给product实例赋值。

实现步骤

1. 定义通用字段更新模型

先完善FieldUpdate类,用来存储每个字段的更新信息:

public class FieldUpdate
{
    // 实体类的属性名称(如Artikel的Prodstat、_Date)
    public string PropertyName { get; set; }
    // 数据库列名称(对应变更日志中的列标识)
    public string ColumnName { get; set; }
    // 字段新值
    public object NewValue { get; set; }
}

2. 反射实现字段赋值与日志记录

在循环中遍历更新字段列表,通过反射完成实体字段赋值,同时生成并执行变更日志:

// 提前缓存Artikel的属性信息,提升大数据量场景下的性能
private static readonly Dictionary<string, PropertyInfo> _artikelProperties = 
    typeof(Artikel).GetProperties().ToDictionary(p => p.Name);

foreach (var product in products)
{
    foreach (var fieldUpdate in fieldUpdateList)
    {
        if (!_artikelProperties.TryGetValue(fieldUpdate.PropertyName, out var property))
            continue;

        // 获取字段旧值并转为字符串
        var oldValue = property.GetValue(product)?.ToString();
        // 给当前product实例赋值新值
        property.SetValue(product, fieldUpdate.NewValue);

        // 生成并执行变更日志SQL
        var changelog = new Changelog(product, fieldUpdate.ColumnName, oldValue, fieldUpdate.NewValue.ToString());
        _Context.Database.ExecuteSqlRaw(changelog.CreateQuery, changelog.GetSqlParameterList());
    }

    // 统一保存EF实体变更(根据上下文配置决定是否需要)
    _Context.SaveChanges();
}

3. 构建字段更新列表示例

以更新状态和日期字段为例:

var fieldUpdateList = new List<FieldUpdate>()
{
    new FieldUpdate()
    {
        PropertyName = "Prodstat",
        ColumnName = "PRODSTAT",
        NewValue = newProductStatus.Nummer
    },
    new FieldUpdate()
    {
        PropertyName = "_Date",
        ColumnName = "_DATE",
        NewValue = DateTime.Now
    }
};

注意事项

  • 类型匹配:确保NewValue的类型与实体属性类型一致,若存在类型差异,需在赋值前添加类型转换逻辑(比如将字符串转为枚举、数值类型)。
  • 性能优化:大数据量循环场景下,必须提前缓存实体属性信息,避免每次循环重复调用反射API,减少性能损耗。

内容的提问来源于stack exchange,提问作者dns_nx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:45:27