diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs index 838252f32..638286b32 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs @@ -7,112 +7,97 @@ using System.Threading.Tasks; namespace SqlSugar { - public class InsertNavProvider where T : class,new() where Root:class,new() + public partial class InsertNavProvider where T : class,new() where Root:class,new() { - public List Roots { get; set; } - public List ParentList { get; set; } - public EntityInfo ParentEntity { get; set; } - public SqlSugarProvider Context { get; set; } + public List _Roots { get; set; } + public List _ParentList { get; set; } + public EntityInfo _ParentEntity { get; set; } + public SqlSugarProvider _Context { get; set; } - public InsertNavProvider ThenInclude(Expression> expression) where TChild : class, new() + + public InsertNavProvider AsNav() { - if (ParentList == null) + return new InsertNavProvider { + _Context = _Context, + _ParentEntity = null, + _ParentList=null, + _Roots= _Roots + }; + } + + public InsertNavProvider ThenInclude(Expression> expression) where TChild : class, new() + { + 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(); - } - var name=ExpressionTool.GetMemberName(expression); - var nav = this.ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); - if (nav.Navigat == null) - { - Check.ExceptionEasy($"{name} no navigate attribute", $"{this.ParentEntity.EntityName}的属性{name}没有导航属性"); + Check.ExceptionEasy($"{name} no navigate attribute", $"{this._ParentEntity.EntityName}的属性{name}没有导航属性"); } if (nav.Navigat.NavigatType == NavigateType.OneToOne || nav.Navigat.NavigatType == NavigateType.ManyToOne) { - InsertOneToOne(ParentList,this.ParentEntity, name,nav); + InsertOneToOne(name, nav); } else if (nav.Navigat.NavigatType == NavigateType.OneToMany) { - InsertOneToMany(); + InsertOneToMany(name, nav); } - else + else { - InsertManyToMany(); + InsertManyToMany(name, nav); } - return null; + return GetResult(); } - - private void InsertManyToMany() - { - - } - - private void InsertOneToMany() - { - - } - - private void InsertOneToOne(List parentList, EntityInfo parentEntity, string name, EntityColumnInfo nav) - { - var parentColumn = parentEntity.Columns.FirstOrDefault(it => it.PropertyName==nav.Navigat.Name); - this.ParentEntity = this.Context.EntityMaintenance.GetEntityInfo(); - var pkColumn = ParentEntity.Columns.FirstOrDefault(it=>it.IsPrimarykey==true); - if (nav.Navigat.Name2.HasValue()) - { - pkColumn = ParentEntity.Columns.FirstOrDefault(it => it.PropertyName==nav.Navigat.Name2); - } - Check.Exception(pkColumn == null, $" Navigate {parentEntity.EntityName} : {name} is error ", $"导航实体 {parentEntity.EntityName} 属性 {name} 配置错误"); - List childList = new List(); - foreach (var parent in parentList) - { - var childItems=(TChild)nav.PropertyInfo.GetValue(parent); - if (childItems != null) - { - var pkValue = pkColumn.PropertyInfo.GetValue(childItems); - var pvValue = parentColumn.PropertyInfo.GetValue(parent); - if (IsDefaultValue(pvValue)) - { - pvValue = pkValue; - } - if (IsDefaultValue(pvValue)) - { - - } - } - } - parentList = childList; - } - + private static bool IsDefaultValue(object pvValue) { return pvValue == null || pvValue == UtilMethods.GetDefaultValue(pvValue.GetType()); } + private void InitParentList() + { + if (_ParentList == null) + { + _ParentList = GetParentList(_Roots).Cast().ToList(); + } + } + + private InsertNavProvider GetResult() where TChild : class, new() + { + return new InsertNavProvider() + { + _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(); + this._Context.InitMappingInfo(); + var entity = this._Context.EntityMaintenance.GetEntityInfo(); var isIdentity = entity.Columns.Where(it=>it.IsIdentity).Any(); if (isIdentity) { - foreach (var item in datas) - { - this.Context.Insertable(datas).ExecuteCommandIdentityIntoEntity(); - } + InsertIdentity(datas); } else { - this.Context.Insertable(datas).ExecuteCommand(); + this._Context.Insertable(datas).ExecuteCommand(); } - this.ParentEntity = entity; + this._ParentEntity = entity; result = datas; return result; } - public InsertNavProvider AsNav() + private void InsertIdentity(List datas) where Type : class, new() { - return null; + foreach (var item in datas) + { + this._Context.Insertable(item).ExecuteCommandIdentityIntoEntity(); + } } } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderManyToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderManyToMany.cs new file mode 100644 index 000000000..09574d7ca --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderManyToMany.cs @@ -0,0 +1,16 @@ +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 void InsertManyToMany(string name, EntityColumnInfo nav) where TChild : class, new() + { + + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs new file mode 100644 index 000000000..4f05b7804 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToMany.cs @@ -0,0 +1,24 @@ +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 void InsertOneToMany(string name, EntityColumnInfo nav) where TChild : class, new() + { + var parentEntity = _ParentEntity; + var parentList = _ParentList; + var parentColumn = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name); + this._ParentEntity = this._Context.EntityMaintenance.GetEntityInfo(); + foreach (var item in parentList) + { + + } + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToOne.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToOne.cs new file mode 100644 index 000000000..01364ba64 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderOneToOne.cs @@ -0,0 +1,62 @@ +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 void InsertOneToOne(string name, EntityColumnInfo nav) where TChild : class, new() + { + 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} 配置错误"); + List childList = new List(); + foreach (var parent in parentList) + { + var navPropertyValue = parentColumn.PropertyInfo.GetValue(parent); + var childItem = (TChild)nav.PropertyInfo.GetValue(parent); + if (childItem != null) + { + if (IsDefaultValue(navPropertyValue)) + { + var pkValue = pkColumn.PropertyInfo.GetValue(childItem); + if (IsDefaultValue(navPropertyValue)) + { + navPropertyValue = pkValue; + } + } + pkColumn.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(); + } + this._ParentList = childList.Cast().ToList(); + } + + 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/Abstract/SaveableProvider/Storageable.cs b/Src/Asp.Net/SqlSugar/Abstract/SaveableProvider/Storageable.cs index 2a33f1bd5..6fc5b1447 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SaveableProvider/Storageable.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SaveableProvider/Storageable.cs @@ -296,7 +296,7 @@ namespace SqlSugar public IStorageable WhereColumns(string [] columns) { - var list = columns.Select(it=>this.Context.EntityMaintenance.GetDbColumnName(it)).ToList(); + var list = columns.Select(it=>this.Context.EntityMaintenance.GetPropertyName(it)).ToList(); var exp=ExpressionBuilderHelper.CreateNewFields(this.Context.EntityMaintenance.GetEntityInfo(), list); return this.WhereColumns(exp); } diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index 52add15bc..aa9ce39d2 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -897,8 +897,8 @@ namespace SqlSugar public InsertNavProvider InsertNav(List datas) where T : class, new() { var result = new InsertNavProvider(); - result.Roots = datas; - result.Context = this; + result._Roots = datas; + result._Context = this; return result; } public DeleteNavProvider DeleteNav(T data) diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index a2d88c217..70e934592 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -89,6 +89,9 @@ + + +