导航插入 一级导航存在数据时,二级导航不插入 返回

SqlSugar
13 173

导航插入 


A 一对多 B 一对多 C

B表 存在数据时,C表 数据不插入


具体用例如下:

using System;
using System.Collections.Generic;

using SqlSugar;

namespace OrmTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var db = new SqlSugarScope(new ConnectionConfig()
            {
                ConnectionString = "server=.;database=SQLSUGAR4XTEST;Trusted_Connection=SSPI",
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true
            }); 
            db.Aop.OnLogExecuting = (sql, pars) => //SQL执行前事件。
            {
                //可在这里查看生成的Sql
            };

            //建表 
            db.CodeFirst.InitTables<Country, Province, City>();
            db.DbMaintenance.TruncateTable<Country, Province, City>();

            //插入一级导航数据
            var country = new Country
            {
                Id = 1,
                Provinces = new List<Province> {
                    new Province{
                        Id = 1,
                        CountryId = 1
                    },
                }
            };
            db.InsertNav(country)
                .Include(it => it.Provinces)
                .ExecuteCommand();

            //构造二级导航数据
            country.Provinces[0].Cities = new List<City>
            {
                new City
                {
                    Id = 1,
                    ProvinceId = 1
                }
            };

            //用例代码 
            var result = db.InsertNav(country)
                .Include(it => it.Provinces)
                .ThenInclude(it => it.Cities)
                .ExecuteCommand();//用例代码
            if (!db.Queryable<City>().Where(it => it.Id == 1).Any())
                throw new Exception("未插入二级导航数据");
        }


        //建类
        public class Country
        {
            [SugarColumn(IsPrimaryKey = true)]
            public int Id { get; set; }
            [SugarColumn(IsIgnore = true)]
            [Navigate(NavigateType.OneToMany, nameof(Province.CountryId))]
            public List<Province> Provinces { get; set; }
        }

        public class Province
        {
            [SugarColumn(IsPrimaryKey = true)]
            public int Id { get; set; }
            public int CountryId { get; set; }
            [SugarColumn(IsIgnore = true)]
            [Navigate(NavigateType.OneToMany, nameof(City.ProvinceId))]
            public List<City> Cities { get; set; }
        }

        public class City
        {
            [SugarColumn(IsPrimaryKey = true)]
            public int Id { get; set; }
            public int ProvinceId { get; set; }
        }
    }
}


热忱回答13

  • 这个有人提过了应该二级导航 主键赋值了

    0 回复
  • 2级导航主键不存在是可以插入的

    0 回复
  • 今天修复

    0 回复
  • 发布了个版本 ,导航插入 一对多不管存不存在都会插入


    你这个用例需要改成自增、long、guid或者字符串


    如果是int非自增如果出现重复值会扔出错误,原理:先清空已存在的id,然后在自动赋值因为 int不是自增无法自动赋值会扔出错误提示

    换成 自增、LONG GUID、或者字符串 用例可以跑通

    0 回复
  • @fate sta

    我遇到一个无法满足的场景:

        主表与一级导航,存在不需要插入

        二级导航,不存在需要插入


    产生的问题:

        升级前:

            逻辑:判断一级导航存在后,跳过了二级导航

            结果:二级导航没能插入

        升级后:

            逻辑:一级导航存在,但是重置Id后插入了,然后二级导航插入,并且归属于新的一级导航

            结果:意外插入新的一级导航,并且插入的二级导航,错误的归属于新一级导航


    实际需要:一级导航存在不插入,然后判断二级导航存在与否,插入或跳过


    用例代码(略):

    db.InsertNav(country)
        .Include(it => it.Provinces)
        .ThenInclude(it => it.Cities)
        .ExecuteCommand();


    0 回复
  • @乐乐是🐷:我在支持一下配置设置吧


    db.InsertNav(country)
        .Include(it => it.Provinces,new options(){ xxxxx })
        .ThenInclude(it => it.Cities)
        .ExecuteCommand();

    这样的

    0 回复
  • @乐乐是🐷: -

    0 回复
  • @fate sta:是我的问题,发帖没说明白

    我是想描述下遇到的问题,并不是改成这样,非常抱歉

    0 回复
  • @乐乐是🐷:我已经改了发布个版本 

    过几分钟可以更新用法如下:



                //用例代码 
                var result = db.InsertNav(country)
                    .Include(it => it.Provinces,new InsertNavOptions() {  OneToManyIfExistsNoInsert=true})
                    .ThenInclude(it => it.Cities, new InsertNavOptions() { OneToManyIfExistsNoInsert = true })
                    .ExecuteCommand();//用例代码


    0 回复
  • @fate sta:收到,非常感谢

    0 回复
  • @乐乐是🐷:可以了吗

    0 回复
  • @fate sta:可以的,测试生效了

    0 回复
  • @乐乐是🐷:好的

    0 回复