关于导航属性 返回

SqlSugar 老数据
14 1654

实体:

public class ItemA
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }

        public string Name { get; set; }

        public object Other { get; set; }

        [Navigate(NavigateType.OneToMany, nameof(ItemB.AId))]
        public List<ItemB> ItemBs { get; set; }

        [Navigate(NavigateType.OneToMany, nameof(ItemC.AId))]
        public List<ItemC> ItemCs { get; set; }

        [Navigate(NavigateType.OneToMany, nameof(ItemD.AId))]
        public List<ItemD> ItemDs { get; set; }

    }
    public class ItemB
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        public string Name { get; set; }
        public int No { get; set; }
        public int AId { get; set; }
    }
    public class ItemC
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        public string Name { get; set; }
        public int No { get; set; }
        public int AId { get; set; }

        public int BId { get; set; }

    }

    public class ItemD

    {

        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]

        public int Id { get; set; }

        public string Name { get; set; }

        public string SomeThing { get; set; }

        public int AId { get; set; }

        public int BId
        {
            get; set;

        }
        #endregion

    }
    
    var r=db.InsertNav(itemA)
                    .Include(i => i.ItemBs)
                    .Include(i => i.ItemCs)
                    .ExecuteCommand();

执行后  ItemBs 和ItemCs内部的AId 正确赋值,但是ItemC的BId 为null。我哪块有问题,能否帮忙指正下。



                  

热忱回答14

  • 如果后续再接Update  会导致ItemB 重复插入一遍

    0 回复
  • fate sta fate sta VIP0
    2022/12/16
                 
     //强制删除下级一对多脏数据(5.0.2.3-preview04)
     db.UpdateNav(list)
      .Include(z1 => z1.Books,new UpdateNavOptions(){OneToManyDeleteAll=true})//强制删除下级一对多的脏数据
      .ThenInclude(z1 => z1.RoomList)
      .ExecuteCommand();


    0 回复
  • @fate sta:期望值1.png

    而不是:2.png

    现在的弄的要么A 跟BC 都关联了,B和C 缺不关联;或者如上图一样 ,把C增加一个IitemB的属性,那么Update后ABC 没联系到一起,逻辑22分开了,更新的时候 C里的ItemB 又插入一遍

    0 回复
  • 之前到时候是这样:3.png

    0 回复
  • fate sta fate sta VIP0
    2022/12/17

    提供DEMO吧 不清楚你说的什么

    0 回复
  • fate sta fate sta VIP0
    2022/12/17
    0 回复
  •      using Modles;
              using SqlSugar;
              using System;
              using System.Collections.Generic;
         //控制台:
         
         class Program
            static void Main(string[] args)
            {
                var doc = new Document();
                doc.Name = "项目";
                doc.Num = "0001";
                doc.Createdtime = DateTime.Now;
                doc.Details = new List<Detail>() 
                {
                    new Detail
                    {
                         Count=100,
                         Createddate=DateTime.Now,
                         Summary="明细1摘要",
                         Sequencenumber=1,
                         Num="0001"
                    },
                    new Detail
                    {
                         Count=200,
                         Createddate=DateTime.Now,
                         Summary="明细2摘要",
                         Sequencenumber=2,
                         Num="0002"
                    }
                };
                doc.Detail_Exs = new List<Detail_Ex> 
                {
                    new Detail_Ex
                    {
                         Num=null,
                         Rowno="0001",
                         Summary="明细1扩展"
                    },
                    new Detail_Ex
                    {
                         Num=null,
                         Rowno="0002",
                         Summary="明细2扩展"
                    }
                };
    
                var r = DbContext.Db.InsertNav(doc)
                    .Include(c => c.Details)
                    .Include(c => c.Detail_Exs).ThenInclude(c => c.Detail)
                    .Include(c => c.Auxiliaries).ThenInclude(c => c.Detail)
                    .ExecuteCommand();
                Console.WriteLine($"{(r ? "成功" : "失败")}");
    
                Console.ReadKey();
            }
         }
            
         public class DbContext  
         {
             
            public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig()
            {
                DbType = SqlSugar.DbType.SqlServer,
                ConnectionString = "Server=127.0.0.1;Database=master;user id=sa;password=123456;MultipleActiveResultSets=true",
                IsAutoCloseConnection = true
            },
             db => {
                 //单例参数配置,所有上下文生效
                 db.Aop.OnLogExecuting = (s, p) =>
                 {
                     Console.WriteLine(s);
                 };
             });
         }
        
        
        //实体:
        
         public class Document
        {
            /// <summary>
            ///  编号
            ///</summary>
            [SugarColumn(ColumnName="num"    )]
             public string Num { get; set; }
            /// <summary>
            ///  名称
            ///</summary>
            [SugarColumn(ColumnName="name"    )]
             public string Name { get; set; }   
            /// <summary>
            ///  时间戳
            ///</summary>
             [SugarColumn(ColumnName="ts" ,IsIgnore =true   )]
             public byte[] Ts { get; set; }   
            /// <summary>
            ///  排序号 
            ///</summary>
            [SugarColumn(ColumnName="orderNum"    )]
             public string OrderNum { get; set; }
            
            /// <summary>
            ///  主键ID
            ///</summary>
             [SugarColumn(ColumnName="id" ,IsPrimaryKey = true ,IsIdentity = true  )]
             public int Id { get; set; }       
            /// <summary>
            ///  创建时间 
            ///</summary>
            [SugarColumn(ColumnName= "createdate")]
             public DateTime? Createdtime { get; set; }
            /// <summary>
            /// 
            /// </summary>
            [Navigate(NavigateType.OneToMany,nameof(Detail.DocId))]
            public List<Detail> Details { get; set; }
    
            /// <summary>
            /// 
            /// </summary>
            [Navigate(NavigateType.OneToMany, nameof(Detail_Ex.Docid))]
            public List<Detail_Ex> Detail_Exs { get; set; }
            /// <summary>
            /// 
            /// </summary>
            [Navigate(NavigateType.OneToMany, nameof(Auxiliary.DocId))]
            public List<Auxiliary>  Auxiliaries { get; set; }
        }
        
         public class Detail
        {
            /// <summary>
            ///  编号 
            ///</summary>
            [SugarColumn(ColumnName="num"    )]
             public string Num { get; set; }
    
            /// <summary>
            /// 摘要  
            ///</summary>
            [SugarColumn(ColumnName="summary"    )]
             public string Summary { get; set; }
            
            /// <summary>
            ///  数量 
            ///</summary>
            [SugarColumn(ColumnName="count"    )]
             public int? Count { get; set; }
            /// <summary>
            ///  顺序号
            ///</summary>
            [SugarColumn(ColumnName="sequencenumber"    )]
             public int? Sequencenumber { get; set; }
            /// <summary>
            ///  分布时间戳
            ///</summary>
             [SugarColumn(ColumnName="ts" ,IsIgnore =true   )]
             public byte[] Ts { get; set; }
            
            /// <summary>
            ///  主键ID
            ///</summary>
             [SugarColumn(ColumnName="id" ,IsPrimaryKey = true ,IsIdentity = true  )]
             public int Id { get; set; }
           
            /// <summary>
            ///  Docid 
            ///</summary>
            [SugarColumn(ColumnName="docId"    )]
             public int? DocId { get; set; }
            /// <summary>
            ///  创建时间 
            ///</summary>
            [SugarColumn(ColumnName = "createddate")]
            public DateTime? Createddate { get; set; }
        }
        
        public class Detail_Ex
        {
            /// <summary>
            ///  编号 
            ///</summary>
            [SugarColumn(ColumnName="num"    )]
             public string Num { get; set; }
            /// <summary>
            ///  行号
            ///</summary>
            [SugarColumn(ColumnName="rowno"    )]
             public string Rowno { get; set; }
            /// <summary>
            ///  摘要 
            ///</summary>
            [SugarColumn(ColumnName="summary"    )]
             public string Summary { get; set; }       
            
            /// <summary>
            ///  时间戳
            ///</summary>
             [SugarColumn(ColumnName="ts"  ,IsIgnore =true  )]
             public byte[] Ts { get; set; }
            
            
            /// <summary>
            ///  主键ID
            ///</summary>
             [SugarColumn(ColumnName="id" ,IsPrimaryKey = true ,IsIdentity = true  )]
             public int Id { get; set; }
            
            /// <summary>
            ///  DocID 
            ///</summary>
            [SugarColumn(ColumnName="docid"    )]
             public int Docid { get; set; }
            /// <summary>
            ///  detailID
            ///</summary>
            [SugarColumn(ColumnName="detailId"    )]
             public int? DetailId { get; set; }
            /// <summary>
            ///  auxiliaryId 
            ///</summary>
            [SugarColumn(ColumnName="auxiliaryid"    )]
             public int? AuxiliaryId { get; set; }
                   
            /// <summary>
            ///  创建时间 
            ///</summary>
            [SugarColumn(ColumnName="createddate"    )]
             public DateTime? Createddate { get; set; }
            [Navigate(NavigateType.OneToOne, nameof(DetailId))]
            public Detail Detail { get; set; }
            [Navigate(NavigateType.OneToOne, nameof(AuxiliaryId))]
            public Auxiliary Auxiliary { get; set; }
        }
        
        public class Auxiliary
        {
            /// <summary>
            ///  
            ///</summary>
             [SugarColumn(ColumnName="num"    )]
             public string Num { get; set; }
            /// <summary>
            ///  名称
            ///</summary>
            [SugarColumn(ColumnName = "name")]
            public string Name { get; set; }
            /// <summary>
            ///  
            ///</summary>
            [SugarColumn(ColumnName="orderNo"    )]
             public string OrderNum { get; set; }
    
            /// <summary>
            ///  
            ///</summary>
             [SugarColumn(ColumnName="ts"    )]
             public byte[] Ts { get; set; }
            
            /// <summary>
            ///  
            ///</summary>
             [SugarColumn(ColumnName="id" ,IsPrimaryKey = true ,IsIdentity = true  )]
             public int Id { get; set; }
            
            /// <summary>
            ///  
            ///</summary>
             [SugarColumn(ColumnName="docId"    )]
             public int? DocId { get; set; }
            /// <summary>
            ///  
            ///</summary>
             [SugarColumn(ColumnName="detailId"    )]
             public int? DetailId { get; set; }       
            /// <summary>
            ///  
            ///</summary>
             [SugarColumn(ColumnName="createdate"    )]
             public DateTime? CreateDate { get; set; }
            [Navigate(NavigateType.OneToOne, nameof(DetailId))]
            public Detail Detail { get; set; }
    
        }

     1、Detail Detail_Ex Auxiliary 三者的DocId 关系Docment的Id

     2、Detail_Ex 和Auxiliary 的DetailId 两者关系Detail的Id

     3、Detail_Ex的AuxiliaryId关系Auxiliary的id

    现在结果是第2步没有达到效果,第3步和第二步一样的原因

    image.png


     


    0 回复
  • 不知道这样我是否说明白了 

    0 回复
  • fate sta fate sta VIP0
    2022/12/17

    image.png1



    你的用例 ex里面并且没有details 为什么还要加个theninclude

    0 回复
  • fate sta fate sta VIP0
    2022/12/17
                var r = DbContext.Db.InsertNav(doc)
                    .Include(c => c.Details)
                    .Include(c => c.Detail_Exs) 
                    .ExecuteCommand();

    你的DEMO我怎么看都只能写成这样

    0 回复
  • @fate sta:嗯 我本来也是

    var r = DbContext.Db.InsertNav(doc)
                    .Include(c => c.Details)
                    .Include(c => c.Detail_Exs) 
                    .ExecuteCommand();

    这样的,但是因为Detail_Ex的DetailId 没数据,所以才加了个,请问怎么才能让Detail_Ex的DetailId 正确插入对应的Detail的Id

    0 回复
  • fate sta fate sta VIP0
    2022/12/17

    image.png


    第三层属性才能用theninlcued

    0 回复
  •  几个二层之间又有一对一关系  ,这个要单独手动更新吗

    0 回复
  • fate sta fate sta VIP0
    2022/12/18

    不清楚你讲的,你先把ORM自带的功能看懂。有问题提供完整DEMO

    0 回复