diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProvider.cs index a5e836ccd..150254380 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProvider.cs @@ -18,6 +18,7 @@ namespace SqlSugar public SqlSugarProvider _Context { get; set; } public UpdateNavOptions _Options { get; set; } + public bool IsFirst { get; set; } public UpdateNavProvider AsNav() { return new UpdateNavProvider @@ -54,6 +55,7 @@ namespace SqlSugar private UpdateNavProvider _ThenInclude(Expression> expression) where TChild : class, new() { var isRoot = _RootList == null; + IsFirst = isRoot && this._ParentList == null; InitParentList(); var name = ExpressionTool.GetMemberName(expression); var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); @@ -62,6 +64,7 @@ namespace SqlSugar Check.ExceptionEasy($"{name} no navigate attribute", $"{this._ParentEntity.EntityName}的属性{name}没有导航属性"); } UpdateRoot(isRoot, nav); + IsFirst = false; if (nav.Navigat.NavigatType == NavigateType.OneToOne || nav.Navigat.NavigatType == NavigateType.ManyToOne) { UpdateOneToOne(name, nav); @@ -79,6 +82,7 @@ namespace SqlSugar private UpdateNavProvider _ThenInclude(Expression>> expression) where TChild : class, new() { var isRoot = _RootList == null; + IsFirst = isRoot && this._ParentList == null; InitParentList(); var name = ExpressionTool.GetMemberName(expression); var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); @@ -87,6 +91,7 @@ namespace SqlSugar Check.ExceptionEasy($"{name} no navigate attribute", $"{this._ParentEntity.EntityName}的属性{name}没有导航属性"); } UpdateRoot(isRoot, nav); + IsFirst = false; if (nav.Navigat.NavigatType == NavigateType.OneToOne || nav.Navigat.NavigatType == NavigateType.ManyToOne) { UpdateOneToOne(name, nav); @@ -121,12 +126,41 @@ namespace SqlSugar if (_Options != null && _Options.RootFunc != null) { var updateable = this._Context.Updateable(_Roots); - var exp= _Options.RootFunc as Expression>>; + var exp = _Options.RootFunc as Expression>>; Check.ExceptionEasy(exp == null, "UpdateOptions.RootFunc is error", "UpdateOptions.RootFunc"); - var com= exp.Compile(); + var com = exp.Compile(); com(updateable); updateable.ExecuteCommand(); } + else if (IsFirst && _RootOptions != null) + { + var isInsert = _RootOptions.IsInsertRoot; + if (isInsert) + { + var newRoots=new List(); + foreach (var item in _Roots) + { + var x = this._Context.Storageable(item).ToStorage(); + if (x.InsertList.HasValue()) + { + newRoots.Add( x.AsInsertable.ExecuteReturnEntity()); + } + else + { + x.AsUpdateable.ExecuteCommand(); + newRoots.Add(item); + } + } + _ParentList=_RootList=newRoots.Cast().ToList(); + } + else + { + this._Context.Updateable(_Roots) + .UpdateColumns(_RootOptions.UpdateColumns) + .IgnoreColumns(_RootOptions.IgnoreColumns) + .ExecuteCommand(); + } + } else { this._Context.Updateable(_Roots).ExecuteCommand(); diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index 66a21ce40..b63a678dd 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs @@ -343,8 +343,11 @@ namespace SqlSugar } public IUpdateable UpdateColumns(string[] columns) { - ThrowUpdateByExpression(); - this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => GetPrimaryKeys().Select(iit => iit.ToLower()).Contains(it.DbColumnName.ToLower()) || columns.Contains(it.PropertyName, StringComparer.OrdinalIgnoreCase)).ToList(); + if (columns.HasValue()) + { + ThrowUpdateByExpression(); + this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => GetPrimaryKeys().Select(iit => iit.ToLower()).Contains(it.DbColumnName.ToLower()) || columns.Contains(it.PropertyName, StringComparer.OrdinalIgnoreCase)).ToList(); + } return this; } public IUpdateable UpdateColumnsIF(bool isUpdateColumns, Expression> columns) diff --git a/Src/Asp.Net/SqlSugar/Entities/DeleteNavOptions.cs b/Src/Asp.Net/SqlSugar/Entities/DeleteNavOptions.cs index f1d322735..439671d61 100644 --- a/Src/Asp.Net/SqlSugar/Entities/DeleteNavOptions.cs +++ b/Src/Asp.Net/SqlSugar/Entities/DeleteNavOptions.cs @@ -26,7 +26,7 @@ namespace SqlSugar { public string IgnoreColumns { get; set; } public string[] UpdateColumns { get; set; } - public bool IsInsert { get; set; } + public bool IsInsertRoot { get; set; } } public class UpdateNavOptions {