C#中Entity Framework Plus自增主键BulkDelete失效问题排查
问题排查与解决方案
核心原因
你的BulkDelete失效是因为传入的实体主键值和数据库中实际记录不匹配:
Autokey是自增主键,数据库中实际存储的是系统生成的非0值- 但Excel导入的
Autokey全是0,EF Extension的BulkDelete默认通过主键字段匹配要删除的记录,自然找不到对应数据,所以无删除动作也不报错。
解决方案
方案1:用业务唯一字段匹配删除(推荐)
如果UserName + EmailId + AppsInstalledInSystem是业务上的唯一标识,可以告诉EF Extension用这些字段作为匹配条件,而非主键:
context.BulkDelete(mappedvalue, options => { options.UseAudit = true; options.AuditEntries = auditEntries; // 指定匹配字段 options.MatchOn = new List<string> { "UserName", "EmailId", "AppsInstalledInSystem" }; });
方案2:先查询获取正确主键再删除
如果必须依赖主键删除,需要先根据Excel的业务字段从数据库查询出带正确Autokey的实体列表,再执行BulkDelete:
// 从Excel数据提取业务标识 var excelIdentifiers = mappedvalue.Select(x => new { x.UserName, x.EmailId, x.AppsInstalledInSystem }).ToList(); // 查询数据库中对应的实体(带正确Autokey) var entitiesToDelete = context.ScTable .Where(db => excelIdentifiers.Any(excel => excel.UserName == db.UserName && excel.EmailId == db.EmailId && excel.AppsInstalledInSystem == db.AppsInstalledInSystem)) .ToList(); // 执行批量删除 context.BulkDelete(entitiesToDelete, options => { options.UseAudit = true; options.AuditEntries = auditEntries; });
额外检查:确认自增主键配置
确保你的实体已经正确配置了自增主键,否则EF Extension可能无法识别主键规则:
在DbContext的OnModelCreating方法中用Fluent API配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<ScTable>() .Property(s => s.Autokey) .ValueGeneratedOnAdd() // 标记为新增时自动生成 .IsRequired(); }
内容的提问来源于stack exchange,提问作者Sapri s
相关产品推荐
相关产品推荐

