From 85733a79a4bf781524bb437f259bfe7c4938ee34 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Fri, 3 Mar 2023 14:12:16 +0800 Subject: [PATCH] Update Nav Insert --- .../ExecuteNavProvider/InsertNavProvider.cs | 27 +++++++++++++- .../InsertNavProviderOneToMany.cs | 9 ++++- .../ExecuteNavProvider/InsertNavTask.cs | 37 +++++++++++++++++-- .../Abstract/ExecuteNavProvider/NavContext.cs | 18 +++++++++ .../SugarProvider/SqlSugarProvider.cs | 2 + Src/Asp.Net/SqlSugar/SqlSugar.csproj | 1 + 6 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/NavContext.cs diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs index 73779c1e9..742501ff3 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs @@ -19,6 +19,8 @@ namespace SqlSugar public NavigateType? _NavigateType { get; set; } public bool IsFirst { get; set; } public InsertNavOptions _navOptions { get; set; } + public bool IsNav { get; internal set; } + internal NavContext NavContext { get; set; } public InsertNavProvider AsNav() { @@ -56,10 +58,12 @@ namespace SqlSugar private InsertNavProvider _ThenInclude(Expression> expression) where TChild : class, new() { var name = ExpressionTool.GetMemberName(expression); + var isRoot = false; if (this._ParentEntity == null) { this._ParentEntity = this._Context.EntityMaintenance.GetEntityInfo(); this.IsFirst = true; + isRoot = true; } var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); if (nav.Navigat == null) @@ -82,20 +86,21 @@ namespace SqlSugar InitParentList(); InsertManyToMany(name, nav); } + AddContextInfo(name,isRoot); return GetResult(); } private InsertNavProvider _ThenInclude(Expression>> expression) where TChild : class, new() { var name = ExpressionTool.GetMemberName(expression); + var isRoot = false; if (this._ParentEntity == null) { this._ParentEntity = this._Context.EntityMaintenance.GetEntityInfo(); IsFirst = true; + isRoot = true; } var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); - ; - if (nav.Navigat == null) { Check.ExceptionEasy($"{name} no navigate attribute", $"{this._ParentEntity.EntityName}的属性{name}没有导航属性"); @@ -116,7 +121,25 @@ namespace SqlSugar InitParentList(); InsertManyToMany(name, nav); } + AddContextInfo(name,isRoot); return GetResult(); } + + private void AddContextInfo(string name,bool isRoot) + { + if (IsNav || isRoot) + { + if (this.NavContext != null && this.NavContext.Items != null) + { + this.NavContext.Items.Add(new NavContextItem() { Level = 0, RootName = name }); + } + } + } + private bool NotAny(string name) + { + if (IsFirst) return true; + if (this.NavContext == null) return true; + return this.NavContext?.Items?.Any(it => it.RootName == name) == false; + } } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs index 54fc67c93..0f73f6efe 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs @@ -42,7 +42,14 @@ namespace SqlSugar } } Check.ExceptionEasy(thisPkColumn == null, $"{thisEntity.EntityName}need primary key", $"实体{thisEntity.EntityName}需要主键"); - InsertDatas(children, thisPkColumn); + if (NotAny(name)) + { + InsertDatas(children, thisPkColumn); + } + else + { + this._ParentList = children.Cast().ToList(); + } SetNewParent(thisEntity, thisPkColumn); } diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavTask.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavTask.cs index b4c076508..bd7f93525 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavTask.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavTask.cs @@ -12,42 +12,51 @@ namespace SqlSugar internal SqlSugarProvider Context { get; set; } internal InsertNavProvider insertNavProvider { get; set; } + internal NavContext NavContext { get; set; } public InsertNavTask Include(Expression> expression) where TChild : class, new() { this.Context = insertNavProvider._Context; + insertNavProvider.NavContext = this.NavContext; InsertNavTask result = new InsertNavTask(); Func> func = () => insertNavProvider.ThenInclude(expression); result.PreFunc = func; result.Context = this.Context; + result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression>> expression) where TChild : class, new() { this.Context = insertNavProvider._Context; + insertNavProvider.NavContext = this.NavContext; InsertNavTask result = new InsertNavTask(); Func> func = () => insertNavProvider.ThenInclude(expression); result.PreFunc = func; result.Context = this.Context; + result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression> expression,InsertNavOptions options) where TChild : class, new() { this.Context = insertNavProvider._Context; + insertNavProvider.NavContext = this.NavContext; InsertNavTask result = new InsertNavTask(); Func> func = () => insertNavProvider.ThenInclude(expression, options); result.PreFunc = func; result.Context = this.Context; + result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression>> expression, InsertNavOptions options) where TChild : class, new() { this.Context = insertNavProvider._Context; + insertNavProvider.NavContext =this.NavContext; InsertNavTask result = new InsertNavTask(); Func> func = () => insertNavProvider.ThenInclude(expression, options); result.PreFunc = func; result.Context = this.Context; + result.NavContext = this.NavContext; return result; } } @@ -55,20 +64,33 @@ namespace SqlSugar { public SqlSugarProvider Context { get; set; } public Func> PreFunc { get; set; } + internal NavContext NavContext { get; set; } + public InsertNavTask ThenInclude(Expression> expression) where TChild : class, new() { InsertNavTask result = new InsertNavTask(); - Func> func = () => PreFunc().ThenInclude(expression); + Func> func = () => { + var nav = PreFunc().ThenInclude(expression); + nav.NavContext = this.NavContext; + return nav; + }; result.PreFunc = func; result.Context = this.Context; + result.NavContext = this.NavContext; return result; } public InsertNavTask ThenInclude(Expression>> expression) where TChild : class, new() { InsertNavTask result = new InsertNavTask(); - Func> func = () => PreFunc().ThenInclude(expression); + Func> func = () => + { + var nav = PreFunc().ThenInclude(expression); + nav.NavContext = this.NavContext; + return nav; + }; result.PreFunc = func; result.Context = this.Context; + result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression> expression) where TChild : class, new() @@ -88,6 +110,7 @@ namespace SqlSugar Func> func = () => PreFunc().ThenInclude(expression,options); result.PreFunc = func; result.Context = this.Context; + result.NavContext = this.NavContext; return result; } public InsertNavTask ThenInclude(Expression>> expression, InsertNavOptions options) where TChild : class, new() @@ -96,6 +119,7 @@ namespace SqlSugar Func> func = () => PreFunc().ThenInclude(expression, options); result.PreFunc = func; result.Context = this.Context; + result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression> expression, InsertNavOptions options) where TChild : class, new() @@ -164,9 +188,16 @@ namespace SqlSugar private InsertNavTask AsNav() { InsertNavTask result = new InsertNavTask(); - Func> func = () => PreFunc().AsNav(); + Func> func = () => { + + var navas= PreFunc().AsNav(); + navas.NavContext = this.NavContext; + navas.IsNav = true; + return navas; + }; result.PreFunc = func; result.Context = this.Context; + result.NavContext = this.NavContext; return result; } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/NavContext.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/NavContext.cs new file mode 100644 index 000000000..1e14f69c4 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/NavContext.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + internal class NavContext + { + public List Items { get; set; } + } + internal class NavContextItem + { + public int Level { get; set; } + public string RootName { get; set; } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index 9e3e4b66f..eb9d2a8f9 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -1111,6 +1111,7 @@ namespace SqlSugar provider._Roots = datas; provider._Context = this; result.insertNavProvider = provider; + result.NavContext = new NavContext() { Items = new List() }; return result; } public InsertNavTaskInit InsertNav(T data, InsertNavRootOptions rootOptions) where T : class, new() @@ -1125,6 +1126,7 @@ namespace SqlSugar provider._Context = this; provider._RootOptions = rootOptions; result.insertNavProvider = provider; + result.NavContext = new NavContext() { Items = new List() }; return result; } public DeleteNavTaskInit DeleteNav(T data) where T : class, new() diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index fe58a5056..b3a6f6912 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -90,6 +90,7 @@ +