Entity Framework更新SalesOrder记录时意外删除其他记录如何解决
问题根源
你的异常由两套不匹配的实体关系配置导致:
SalesOrderConfiguration中配置关系时,.WithMany()没有传入对应导航属性参数,等于告知EF Core:SalesOrderReason实体不存在指向SalesOrder的集合导航属性,当前关系为「一个SalesOrderReason对应多个SalesOrder」- 你又在
SalesOrderReason中新增了ICollection<SalesOrder>类型的SalesOrdersWithReason属性,且单独编写了从SalesOrderReason侧出发的关系配置
两套配置冲突时EF Core会错误将关系推断为「一个SalesOrderReason只能关联一个SalesOrder」的一对一关系,当你给第二个SalesOrder绑定同一个ReasonID时,EF为了满足一对一约束会自动删除前一条关联的SalesOrder记录,和你遇到的现象完全一致。
解决方案
二选一即可,不要同时保留两套配置:
方案1:保留SalesOrderReason侧的集合导航属性
删掉你单独编写的SalesOrderReason侧的关系配置,仅修改SalesOrderConfiguration的关系配置,把空参数的.WithMany()替换为对应导航属性:
public class SalesOrderConfiguration : IEntityTypeConfiguration<SalesOrder> { public void Configure(EntityTypeBuilder<SalesOrder> builder) { builder.HasKey(e => e.ID); builder.Property(e => e.ID) .ValueGeneratedOnAdd(); // 修改此处,指定对应导航属性 builder.HasOne(s => s.SalesOrderReason) .WithMany(e => e.SalesOrdersWithReason) .HasForeignKey(s => s.SalesOrderReasonID); } }
方案2:不需要SalesOrderReason侧的集合导航属性
删除SalesOrderReason实体中的SalesOrdersWithReason属性,同时删掉你单独编写的从SalesOrderReason侧出发的关系配置,保留现有SalesOrderConfiguration的配置即可。
附加优化建议
桌面端场景通常DbContext生命周期较长,你传入的SalesOrder是从GridView的绑定数据中获取的,可能存在当前上下文未跟踪该实体的情况,建议修改保存逻辑避免异常:
private static void ChangeSalesOrderReason(SalesOrder salesOrder, int salesOrderReasonID) { var entry = _context.Entry(salesOrder); if (entry.State == EntityState.Detached) { _context.SalesOrders.Attach(salesOrder); } salesOrder.SalesOrderReasonID = salesOrderReasonID; SalesOrderRepository.Save(); }
内容的提问来源于stack exchange,提问作者Graham
相关产品推荐
相关产品推荐

