Entity Framework向一对多关系添加数据时出现并发异常如何解决
问题排查与解决方案
1. 优先排查BaseEntity主键配置问题
你遇到的异常90%以上的概率是BaseEntity中的主键字段配置错误导致:
- 若
BaseEntity的主键为Id(默认命名),且类型为Guid,需要明确配置主键生成规则,要么在数据库层面设置默认值为newsequentialid()/newid(),要么在创建实体时手动赋值主键,不要留空。 - 正确的BaseEntity配置示例:
public class BaseEntity { [Key] // 如果是数据库自动生成主键加这个特性 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } }
如果选择手动给主键赋值,修改你的Product创建代码:
var productToAdd = new Product { Id = Guid.NewGuid(), // 新增手动赋值主键的逻辑 Name = request.Product.Name, Description = request.Product.Description, SalePrice = request.Product.SalePrice, };
2. 修正关联关系配置写法
你当前用的弱类型字符串配置容易出现拼写错误,建议改成强类型配置,同时确认配置块归属:
// 这段配置要放在Product的实体配置块下,或者统一写在DbContext的OnModelCreating里 modelBuilder.Entity<Product>(b => { b.HasOne(p => p.Company) .WithMany(c => c.Products) .HasForeignKey(p => p.CompanyId) .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation(p => p.Company); }); modelBuilder.Entity<Company>(b => { b.Navigation(c => c.Products); });
3. 其他排查方向
- 检查是否配置了全局查询筛选器,比如软删除字段
IsDeleted的自动筛选,如果插入的Product默认带了IsDeleted=true,会导致EF判断插入行数为0。 - 不需要提前
Include(x => x.Products)加载Company下所有产品,去掉Include即可,不会影响关联新增逻辑,还能提升查询性能。
你可以在DbContext配置中开启SQL日志输出,查看EF生成的INSERT语句是否符合预期,即可快速定位问题。
内容的提问来源于stack exchange,提问作者newbieDev
相关产品推荐
相关产品推荐

