如何配置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
相关产品推荐
相关产品推荐

