diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs b/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs index b175cb121..959ebc547 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs @@ -190,25 +190,26 @@ namespace OrmTest x = SqlFunc.Subqueryable().Where(z => z.Id == it.Id).Any() }).ToList(); + var list6 = db.Queryable() + .Includes(x => x.SchoolA, x => x.RoomList) + .Includes(x => x.Books).ToList(); + db.Deleteable().Where(x => x.SchoolA.TeacherList.Any()).ExecuteCommand(); db.Deleteable().Where(x => x.SchoolA.School_Name=="a").ExecuteCommand(); db.Updateable() .SetColumns(it=>it.Name=="a").Where(x => x.SchoolA.School_Name == "a").ExecuteCommand(); - var list6=db.Queryable() - .Includes(x => x.SchoolA, x => x.RoomList) - .Includes(x => x.Books).ToList(); - + db.DbMaintenance.TruncateTable(); - + //开发中 - //db.InsertNav(list6) - //.ThenInclude(z1 => z1.SchoolA) - //.ThenInclude(z1 => z1.RoomList) - //.AsNav() - //.ThenInclude(z1 => z1.Books); + db.InsertNav(list6) + .ThenInclude(z1 => z1.SchoolA) + .ThenInclude(z1 => z1.RoomList) + .AsNav() + .ThenInclude(z1 => z1.Books); } diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs index 638286b32..4f366233e 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs @@ -12,7 +12,9 @@ namespace SqlSugar public List _Roots { get; set; } public List _ParentList { get; set; } + public List _RootList { get; set; } public EntityInfo _ParentEntity { get; set; } + public EntityColumnInfo _ParentPkColumn { get; set; } public SqlSugarProvider _Context { get; set; } @@ -22,10 +24,10 @@ namespace SqlSugar _Context = _Context, _ParentEntity = null, _ParentList=null, - _Roots= _Roots + _Roots= _Roots , + _ParentPkColumn=this._Context.EntityMaintenance.GetEntityInfo().Columns.First(it=>it.IsPrimarykey) }; } - public InsertNavProvider ThenInclude(Expression> expression) where TChild : class, new() { InitParentList(); @@ -49,55 +51,28 @@ namespace SqlSugar } return GetResult(); } - - private static bool IsDefaultValue(object pvValue) + public InsertNavProvider ThenInclude(Expression>> expression) where TChild : class, new() { - return pvValue == null || pvValue == UtilMethods.GetDefaultValue(pvValue.GetType()); - } - private void InitParentList() - { - if (_ParentList == null) + InitParentList(); + var name = ExpressionTool.GetMemberName(expression); + var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); + if (nav.Navigat == null) { - _ParentList = GetParentList(_Roots).Cast().ToList(); + Check.ExceptionEasy($"{name} no navigate attribute", $"{this._ParentEntity.EntityName}的属性{name}没有导航属性"); } - } - - private InsertNavProvider GetResult() where TChild : class, new() - { - return new InsertNavProvider() + if (nav.Navigat.NavigatType == NavigateType.OneToOne || nav.Navigat.NavigatType == NavigateType.ManyToOne) { - _Context = this._Context, - _ParentEntity = this._ParentEntity, - _ParentList = this._ParentList, - _Roots = this._Roots - }; - } - - private List GetParentList(List datas) where Type : class ,new() - { - List result = new List(); - this._Context.InitMappingInfo(); - var entity = this._Context.EntityMaintenance.GetEntityInfo(); - var isIdentity = entity.Columns.Where(it=>it.IsIdentity).Any(); - if (isIdentity) - { - InsertIdentity(datas); + InsertOneToOne(name, nav); } - else + else if (nav.Navigat.NavigatType == NavigateType.OneToMany) { - this._Context.Insertable(datas).ExecuteCommand(); + InsertOneToMany(name, nav); } - this._ParentEntity = entity; - result = datas; - return result; - } - - private void InsertIdentity(List datas) where Type : class, new() - { - foreach (var item in datas) + else { - this._Context.Insertable(item).ExecuteCommandIdentityIntoEntity(); + InsertManyToMany(name, nav); } + return GetResult(); } } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs new file mode 100644 index 000000000..87d1a06a7 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public partial class InsertNavProvider where T : class,new() where Root:class,new() + { + + private static bool IsDefaultValue(object pvValue) + { + return pvValue == null || pvValue == UtilMethods.GetDefaultValue(pvValue.GetType()); + } + private void InitParentList() + { + if (_RootList == null) + { + _RootList= _ParentList = GetRootList(_Roots).Cast().ToList(); + } + else if (_ParentList == null) + { + _ParentList = _RootList; + var pkColumn = this._Context.EntityMaintenance.GetEntityInfo().Columns.FirstOrDefault(it => it.IsPrimarykey); + this._ParentPkColumn = pkColumn; + } + + } + + private InsertNavProvider GetResult() where TChild : class, new() + { + return new InsertNavProvider() + { + _Context = this._Context, + _ParentEntity = this._ParentEntity, + _ParentList = this._ParentList, + _Roots = this._Roots, + _ParentPkColumn=this._ParentPkColumn, + _RootList=this._RootList + }; + } + + private List GetRootList(List datas) where Type : class, new() + { + List result = new List(); + this._Context.InitMappingInfo(); + var entity = this._Context.EntityMaintenance.GetEntityInfo(); + var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey); + InsertDatas(datas, pkColumn); + this._ParentEntity = entity; + result = datas; + return result; + } + + private void InsertIdentity(List datas) where Type : class, new() + { + foreach (var item in datas) + { + this._Context.Insertable(item).ExecuteCommandIdentityIntoEntity(); + } + } + + private EntityColumnInfo GetPkColumnByNav(EntityInfo entity,EntityColumnInfo nav) + { + var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey == true); + if (nav.Navigat.Name2.HasValue()) + { + pkColumn = _ParentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name2); + } + return pkColumn; + } + private EntityColumnInfo GetFKColumnByNav(EntityInfo entity, EntityColumnInfo nav) + { + var fkColumn = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name); + return fkColumn; + } + private void InsertDatas(List children, EntityColumnInfo pkColumn) where TChild : class, new() + { + children = children.Distinct().ToList(); + var x = this._Context.Storageable(children).WhereColumns(new string[] { pkColumn.PropertyName }).ToStorage(); + var insertData = children = x.InsertList.Select(it => it.Item).ToList(); + if (pkColumn.IsIdentity) + { + InsertIdentity(insertData); + } + else + { + this._Context.Insertable(insertData).ExecuteCommand(); + } + this._ParentList = children.Cast().ToList(); + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs index 4f05b7804..a4746eb47 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs @@ -11,14 +11,46 @@ namespace SqlSugar private void InsertOneToMany(string name, EntityColumnInfo nav) where TChild : class, new() { + List children = new List(); var parentEntity = _ParentEntity; var parentList = _ParentList; - var parentColumn = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name); - this._ParentEntity = this._Context.EntityMaintenance.GetEntityInfo(); + var parentNavigateProperty = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == name); + var thisEntity = this._Context.EntityMaintenance.GetEntityInfo(); + var thisPkColumn = GetPkColumnByNav(thisEntity, nav); + var thisFkColumn= GetFKColumnByNav(thisEntity, nav); + EntityColumnInfo parentPkColumn = GetParentPkColumn(); foreach (var item in parentList) { - + var parentValue = parentPkColumn.PropertyInfo.GetValue(item); + var childs = parentNavigateProperty.PropertyInfo.GetValue(item) as List; + if (childs != null) + { + foreach (var child in childs) + { + thisFkColumn.PropertyInfo.SetValue(child, parentValue, null); + } + children.AddRange(childs); + } } + InsertDatas(children, thisPkColumn); + SetNewParent(thisEntity,thisPkColumn); + } + + private EntityColumnInfo GetParentPkColumn() + { + EntityColumnInfo parentPkColumn = _ParentPkColumn; + if (_ParentPkColumn == null) + { + _ParentPkColumn= this._ParentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey); + } + + return parentPkColumn; + } + + private void SetNewParent(EntityInfo entityInfo,EntityColumnInfo entityColumnInfo) where TChild : class, new() + { + this._ParentEntity = entityInfo; + this._ParentPkColumn = entityColumnInfo; } } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToOne.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToOne.cs index 01364ba64..672508a8c 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToOne.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToOne.cs @@ -13,9 +13,9 @@ namespace SqlSugar var parentEntity = _ParentEntity; var parentList = _ParentList; var parentColumn = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name); - this._ParentEntity = this._Context.EntityMaintenance.GetEntityInfo(); - EntityColumnInfo pkColumn = GetOneTwoOneChildPkColumn(nav); - Check.Exception(pkColumn == null, $" Navigate {parentEntity.EntityName} : {name} is error ", $"导航实体 {parentEntity.EntityName} 属性 {name} 配置错误"); + var thisEntity = this._Context.EntityMaintenance.GetEntityInfo(); + EntityColumnInfo thisPkColumn = GetPkColumnByNav(thisEntity, nav); + Check.Exception(thisPkColumn == null, $" Navigate {parentEntity.EntityName} : {name} is error ", $"导航实体 {parentEntity.EntityName} 属性 {name} 配置错误"); List childList = new List(); foreach (var parent in parentList) { @@ -25,38 +25,20 @@ namespace SqlSugar { if (IsDefaultValue(navPropertyValue)) { - var pkValue = pkColumn.PropertyInfo.GetValue(childItem); + var pkValue = thisPkColumn.PropertyInfo.GetValue(childItem); if (IsDefaultValue(navPropertyValue)) { navPropertyValue = pkValue; } } - pkColumn.PropertyInfo.SetValue(childItem, navPropertyValue); + thisPkColumn.PropertyInfo.SetValue(childItem, navPropertyValue); childList.Add(childItem); } } - var x = this._Context.Storageable(childList).WhereColumns(new string[] { pkColumn.PropertyName }).ToStorage(); - if (pkColumn.IsIdentity) - { - InsertIdentity(x.InsertList.Select(it => it.Item).ToList()); - } - else - { - x.AsInsertable.ExecuteCommand(); - } + InsertDatas(childList,thisPkColumn); this._ParentList = childList.Cast().ToList(); + SetNewParent(thisEntity, thisPkColumn); } - - private EntityColumnInfo GetOneTwoOneChildPkColumn(EntityColumnInfo nav) - { - var pkColumn = _ParentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true); - if (nav.Navigat.Name2.HasValue()) - { - pkColumn = _ParentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name2); - } - - return pkColumn; - } - + } } diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 70e934592..39088b4c6 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -89,6 +89,7 @@ +