导航更新一对多,OneToManyInsertOrUpdate无效 返回
ggtc 发布于2025/11/20
主子表实体定义
数据库自增id
[SugarTable("mes_maintain_standard")] public class MesMaintainStandard { [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "Id")] public int Id { get; set; } public string StandardName { get; set; } public bool IsDeleted { get; set; } [Navigate(NavigateType.OneToMany, nameof(MesMaintainStandardDetail.StandardId))] public List<MesMaintainStandardDetail> NavMaintainStandardDetail { get; set; } [Navigate(NavigateType.OneToMany, nameof(MesMaintainConsumption.StandardId))] public List<MesMaintainConsumption> NavMaintainConsumption { get; set; } }public class MesMaintainStandardDetail { [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "Id")] public int Id { get; set; } public int? StandardId { get; set; } public string Content { get; set; } public bool IsDeleted { get; set; } }sqlsugar版本 5.1.4.196
前端什么也不改,从数据库查到数据库直接调用这个方法。但是子表会先逻辑删除在新增,而不是直接更新
public int Update(MesMaintainStandard model) { //假删除(5.1.4.86) Context.QueryFilter.AddTableFilter<MesMaintainStandardDetail>(it => it.IsDeleted == false);//配合查询过滤器 Context.QueryFilter.AddTableFilter<MesMaintainConsumption>(it => it.IsDeleted == false);//配合查询过滤器 foreach (var item in model.NavMaintainStandardDetail) { item.UpdateBy = model.UpdateBy; item.UpdateTime = DateTime.Now; } foreach (var item in model.NavMaintainConsumption) { item.UpdateBy = model.CreateBy; item.UpdateTime = DateTime.Now; } return Context.UpdateNav(model) .Include(r=>r.NavMaintainStandardDetail, new UpdateNavOptions() { OneToManyEnableLogicDelete = true, OneToManyInsertOrUpdate=true }) .Include(r=>r.NavMaintainConsumption, new UpdateNavOptions() { OneToManyEnableLogicDelete = true, OneToManyInsertOrUpdate = true }) .ExecuteCommand()==true?1:0; }文档里面说要主键,但是我数据库主键,实体主键都声明了,数据中主键字段也有值。不清楚为什么还是会先删除再插入。
我每点击一次保存,子表就会删除新增一次

热忱回答(5)
-
fate sta VIP0
2025/11/20你前端子表没传主键吧
0 回复 -
fate sta VIP0
2025/11/20导航是存在才更新,如果不存在那肯定清空掉不存在的。
0 回复 -
ggtc VIP0
2025/11/21@fate sta:传了主键的,执行之前是这样


数据里面有主键,但是执行之后还是插入了两条
0 回复 -
fate sta VIP0
2025/11/21https://www.donet5.com/Home/Doc?typeId=2366
按模版提供DEMO吧
0 回复 -
ggtc VIP0
1个月前@fate sta:
抱歉这两个月时间太紧张了,我来不及试验demo了。
我只能花点时间看了下sqlsugar生成的sql语句,发现再更新主表后,对于子表是先执行删除,再插入。

但是字段OneToManyInsertOrUpdate加了后理应不会生成这条语句才对
总之这个配置没有生效。回到我的代码,因为生成的是逻辑删除,我试着把查询过滤器注释掉,

这样导航更新过程中,删除之后再进行查询这一步,就会把被删除的数据(IsDeleted=true)也查询出来。再下一步根据前端传过来的数据,再把IsDeleted恢复为true。结果好了,我发现正常了。
但是毕竟文档中OneToManyInsertOrUpdate这个字段想要实现的功能没有实现,不知道是不是sqlsugar没有考虑到和字段OneToManyEnableLogicDelete逻辑删除结合使用的情况
0 回复