导航更新一对多,OneToManyInsertOrUpdate无效 返回

SqlSugar 沟通中
5 236
该叫什么 ggtc 发布于2025/11/20
悬赏:0 飞吻
  • 主子表实体定义

    数据库自增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;
    }
  • 文档里面说要主键,但是我数据库主键,实体主键都声明了,数据中主键字段也有值。不清楚为什么还是会先删除再插入。

    我每点击一次保存,子表就会删除新增一次

  • image.png

热忱回答5

  • fate sta fate sta VIP0
    2025/11/20

    你前端子表没传主键吧

    0 回复
  • fate sta fate sta VIP0
    2025/11/20

    导航是存在才更新,如果不存在那肯定清空掉不存在的。

    0 回复
  • ggtc ggtc VIP0
    2025/11/21

    @fate sta:传了主键的,执行之前是这样image.png

    image.png

    数据里面有主键,但是执行之后还是插入了两条

    image.png

    0 回复
  • fate sta fate sta VIP0
    2025/11/21
    0 回复
  • ggtc ggtc VIP0
    1个月前

    @fate sta

    抱歉这两个月时间太紧张了,我来不及试验demo了。

    我只能花点时间看了下sqlsugar生成的sql语句,发现再更新主表后,对于子表是先执行删除,再插入。image.png
    但是字段OneToManyInsertOrUpdate加了后理应不会生成这条语句才对

    image.png
    总之这个配置没有生效。

    回到我的代码,因为生成的是逻辑删除,我试着把查询过滤器注释掉,image.png

    这样导航更新过程中,删除之后再进行查询这一步,就会把被删除的数据(IsDeleted=true)也查询出来。再下一步根据前端传过来的数据,再把IsDeleted恢复为true。结果好了,我发现正常了。

    但是毕竟文档中OneToManyInsertOrUpdate这个字段想要实现的功能没有实现,不知道是不是sqlsugar没有考虑到和字段OneToManyEnableLogicDelete逻辑删除结合使用的情况

    0 回复