diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs index b1cb67062..d6caa9063 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProvider.cs @@ -18,6 +18,7 @@ namespace SqlSugar public SqlSugarProvider _Context { get; set; } public NavigateType? _NavigateType { get; set; } public bool IsFirst { get; set; } + public InsertNavOptions _navOptions { get; set; } public InsertNavProvider AsNav() { @@ -29,9 +30,31 @@ namespace SqlSugar _ParentPkColumn=this._Context.EntityMaintenance.GetEntityInfo().Columns.First(it=>it.IsPrimarykey) }; } + + public InsertNavProvider ThenInclude(Expression> expression,InsertNavOptions options) where TChild : class, new() + { + _navOptions = options; + return _ThenInclude(expression); + } + public InsertNavProvider ThenInclude(Expression>> expression, InsertNavOptions options) where TChild : class, new() + { + _navOptions = options; + return _ThenInclude(expression); + } + public InsertNavProvider ThenInclude(Expression> expression) where TChild : class, new() { + return _ThenInclude(expression); + } + public InsertNavProvider ThenInclude(Expression>> expression) where TChild : class, new() + { + return _ThenInclude(expression); + } + + + private InsertNavProvider _ThenInclude(Expression> expression) where TChild : class, new() + { var name = ExpressionTool.GetMemberName(expression); if (this._ParentEntity == null) { @@ -61,7 +84,8 @@ namespace SqlSugar } return GetResult(); } - public InsertNavProvider ThenInclude(Expression>> expression) where TChild : class, new() + + private InsertNavProvider _ThenInclude(Expression>> expression) where TChild : class, new() { var name = ExpressionTool.GetMemberName(expression); if (this._ParentEntity == null) @@ -70,8 +94,8 @@ namespace SqlSugar IsFirst = 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}没有导航属性"); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs index 8de0301b2..4625594e7 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs @@ -81,12 +81,20 @@ namespace SqlSugar 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 (_NavigateType == NavigateType.OneToMany&&IsFirst==false) + var IsNoExistsNoInsert = _navOptions != null && _navOptions.OneToManyIfExistsNoInsert == true; + if (_NavigateType == NavigateType.OneToMany && IsFirst == false && IsNoExistsNoInsert == false) { var updateData = x.UpdateList.Select(it => it.Item).ToList(); ClearPk(updateData, pkColumn); insertData.AddRange(updateData); } + else if (_NavigateType == NavigateType.OneToMany && IsNoExistsNoInsert == true) + { + children = new List(); + children.AddRange(x.InsertList.Select(it => it.Item).ToList()); + var updateData = x.UpdateList.Select(it => it.Item).ToList(); + children.AddRange(updateData); + } Check.ExceptionEasy(pkColumn==null&&NavColumn==null,$"The entity is invalid",$"实体错误无法使用导航"); InitData(pkColumn, insertData); this._ParentList = children.Cast().ToList(); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavTask.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavTask.cs index c55bbfb4b..19850223a 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavTask.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavTask.cs @@ -31,6 +31,25 @@ namespace SqlSugar result.Context = this.Context; return result; } + + public InsertNavTask Include(Expression> expression,InsertNavOptions options) where TChild : class, new() + { + this.Context = insertNavProvider._Context; + InsertNavTask result = new InsertNavTask(); + Func> func = () => insertNavProvider.ThenInclude(expression, options); + result.PreFunc = func; + result.Context = this.Context; + return result; + } + public InsertNavTask Include(Expression>> expression, InsertNavOptions options) where TChild : class, new() + { + this.Context = insertNavProvider._Context; + InsertNavTask result = new InsertNavTask(); + Func> func = () => insertNavProvider.ThenInclude(expression, options); + result.PreFunc = func; + result.Context = this.Context; + return result; + } } public class InsertNavTask where T : class, new() where Root : class, new() { @@ -60,6 +79,36 @@ namespace SqlSugar { return AsNav().ThenInclude(expression); } + + + + public InsertNavTask ThenInclude(Expression> expression,InsertNavOptions options) where TChild : class, new() + { + InsertNavTask result = new InsertNavTask(); + Func> func = () => PreFunc().ThenInclude(expression,options); + result.PreFunc = func; + result.Context = this.Context; + return result; + } + public InsertNavTask ThenInclude(Expression>> expression, InsertNavOptions options) where TChild : class, new() + { + InsertNavTask result = new InsertNavTask(); + Func> func = () => PreFunc().ThenInclude(expression, options); + result.PreFunc = func; + result.Context = this.Context; + return result; + } + public InsertNavTask Include(Expression> expression, InsertNavOptions options) where TChild : class, new() + { + return AsNav().ThenInclude(expression, options); + } + public InsertNavTask Include(Expression>> expression, InsertNavOptions options) where TChild : class, new() + { + return AsNav().ThenInclude(expression, options); + } + + + public bool ExecuteCommand() { var hasTran = this.Context.Ado.Transaction != null; diff --git a/Src/Asp.NetCore2/SqlSugar/Entities/DeleteNavOptions.cs b/Src/Asp.NetCore2/SqlSugar/Entities/DeleteNavOptions.cs index c4aadec75..8335ab6eb 100644 --- a/Src/Asp.NetCore2/SqlSugar/Entities/DeleteNavOptions.cs +++ b/Src/Asp.NetCore2/SqlSugar/Entities/DeleteNavOptions.cs @@ -16,4 +16,9 @@ namespace SqlSugar public bool ManyToManyIsUpdateA { get; set; } public bool ManyToManyIsUpdateB { get; set; } } + + public class InsertNavOptions + { + public bool OneToManyIfExistsNoInsert { get; set; } + } }