使用EFCore.BulkExtensions的BulkInsertOrUpdate触发非空约束异常
解决EFCore.BulkExtensions BulkInsertOrUpdate主键空值异常问题
问题原因
EFCore.BulkExtensions的BulkInsertOrUpdate方法在处理值类型主键(如long)时,会将默认值0误判为未赋值状态,忽略已配置的ValueGeneratedNever(),尝试向数据库插入null,触发非空约束异常。而BulkInsert或常规SaveChanges的判断逻辑与批量更新方法不同,因此能正常执行。
解决方法
1. 显式指定主键列
调用BulkInsertOrUpdate时,通过BulkConfig明确指定主键列,强制插件使用实体中传入的Id值:
using var context = CreateContext(); NordocKind n = new NordocKind() { Id = 0, Name = "sss" }; var list = new List<NordocKind>() { n }; context.BulkInsertOrUpdate(list, config => { config.PrimaryKeyColumns = new List<string> { nameof(NordocKind.Id) }; });
2. 升级EFCore.BulkExtensions版本
部分旧版本插件存在主键值判断逻辑的bug,升级到最新稳定版可直接解决该问题。
3. 避免使用0作为主键值(可选)
若业务允许,尽量不要用0作为有效主键值,改用非零的合法Id,规避插件的默认值判断逻辑干扰。
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

