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

如何配置EF Core BulkInsert实现容错批量插入?

EF Core BulkExtensions批量插入如何实现非原子性容错插入

我正在使用EF Core BulkExtensions库,以下是批量插入实体列表的代码:

var entities = new List<Enttiy>();
for (var i = 0; i < 1000; i++)
{
  var entity = new Entity();
  // 设置实体属性
  entities.Add(entity);
}
using var context = new DatabaseCotnext();
context.BulkInsert(entities);

当前问题:哪怕只有一条记录插入失败,所有记录都不会被插入。我不希望它以事务性、原子性的方式执行,而是希望尽可能插入更多记录(比如1000条里成功插入900条),请问这是否可行?


可行方案(MariaDB + C#环境)

以下代码可实现容错式批量插入,跳过无效记录并返回错误信息:

public List<string> BulkInsert<T>(List<T> entities)
{
    var problems = new List<string>();
    var table = entities.ToTable();
    var connectionString = ConnectionString;
    if (!connectionString.Contains("AllowLoadLocalInfile"))
    {
        connectionString = $"{connectionString};AllowLoadLocalInfile=true;";
    }
    using var connection = new MySqlConnection(connectionString);
    connection.InfoMessage += (s, e) =>
    {
        foreach (var item in e.Errors)
        {
            problems.Add(item.Message);
        }
    };
    connection.Open();
    var bulkCopy = new MySqlBulkCopy(connection);
    bulkCopy.DestinationTableName = TableName;
    try
    {
        var result = bulkCopy.WriteToServer(table);
        return problems;
    }
    catch (MySqlException ex)
    {
        Logger.LogException(ex);
        Logger.LogError(problems.Merge());
        throw new ServerException(ex.Message + ". 查看日志获取问题列表。同时请确保数据库架构(尤其是列顺序)正确,并且使用FakerHelper进行正确格式化。");
    }
}

核心逻辑说明:

  • 弃用EF Core BulkExtensions,改用MySqlBulkCopy直接操作数据库,规避默认的事务原子性限制
  • 通过InfoMessage事件监听插入过程中的错误,收集所有无效记录的问题描述
  • 开启AllowLoadLocalInfile配置,确保MySQL/MariaDB的批量导入功能正常运行
  • 执行时会自动跳过无法插入的记录,完成有效记录的插入后返回错误列表;若遇到严重异常(如连接失败),则记录日志并抛出自定义异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:01:13