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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:18:04