diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToMany.cs index c072b3a0e..c5cdf5cd6 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToMany.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToMany.cs @@ -68,22 +68,69 @@ namespace SqlSugar var oneToManys = thisEntity.Columns.Where(it => it.Navigat != null && it.Navigat.NavigatType == NavigateType.OneToMany).ToList(); foreach (var oneToMany in oneToManys) { - var fkFieldName = oneToMany.Navigat.Name2?? thisEntity.Columns.FirstOrDefault(it=>it.IsPrimarykey).PropertyName; + var fkFieldName = oneToMany.Navigat.Name2 ?? thisEntity.Columns.FirstOrDefault(it => it.IsPrimarykey).PropertyName; var fkDbColumnName = thisEntity.Columns.FirstOrDefault(it => it.PropertyName == fkFieldName).DbColumnName; - var fks= this._Context.Queryable() + var fks = this._Context.Queryable() .AS(thisEntity.DbTableName) - .In(fkName, ids.Distinct().ToList()).Select(fkDbColumnName).ToDataTable().Rows.Cast().Select(x=>x[0]).ToArray(); + .In(fkName, ids.Distinct().ToList()).Select(fkDbColumnName).ToDataTable().Rows.Cast().Select(x => x[0]).ToArray(); var type = oneToMany.PropertyInfo.PropertyType.GenericTypeArguments[0]; var entity = this._Context.EntityMaintenance.GetEntityInfo(type); var id = oneToMany.Navigat.Name; var column = entity.Columns.FirstOrDefault(it => it.PropertyName == id).DbColumnName; + + DeleteChild(fks, entity, column); + this._Context.Deleteable() .AS(entity.DbTableName) .In(column, fks.Distinct().ToList()).ExecuteCommand(); } } + private void DeleteChild(object[] fks, EntityInfo entity, string column) + { + var childs = entity.Columns.Where(it => it.Navigat != null && it.Navigat?.NavigatType == NavigateType.OneToMany).ToList(); + if (childs.Any()) + { + var pkColumn = entity.Columns.First(it => it.IsPrimarykey); + var pkIds = this._Context.Queryable() + .AS(entity.DbTableName) + .In(column, fks.Distinct().ToList()) + .Select(pkColumn.DbColumnName).ToDataTable().Rows + .Cast().Select(it => it[0]).ToList(); + DeleteChildChild(pkIds, childs); + } + } + + int childIndex = 0; + private void DeleteChildChild(List ids, List childs) + { + childIndex++; + if (childIndex > 4) + { + Check.ExceptionEasy("Removing too many levels", "安全机制限制删除脏数据层级不能超过7层"); + } + foreach (var columnInfo in childs) + { + var navigat = columnInfo.Navigat; + var type = columnInfo.PropertyInfo.PropertyType.GenericTypeArguments[0]; + var thisEntity = this._Context.EntityMaintenance.GetEntityInfo(type); + var fkColumn = thisEntity.Columns.FirstOrDefault(it => navigat.Name.EqualCase(it.PropertyName)); + var thisPkColumn = thisEntity.Columns.FirstOrDefault(it => it.IsPrimarykey); + var childs2 = thisEntity.Columns.Where(it => it.Navigat != null && it.Navigat?.NavigatType == NavigateType.OneToMany).ToList(); ; + if (childs2.Any()) + { + var pkIds = _Context.Queryable().AS(thisEntity.DbTableName) + .In(fkColumn.DbColumnName, ids) + .Select(thisPkColumn.DbColumnName).ToDataTable().Rows + .Cast().Select(it => it[0]).ToList(); + + DeleteChildChild(pkIds, childs2); + } + _Context.Deleteable().AS(thisEntity.DbTableName).In(fkColumn.DbColumnName, ids).ExecuteCommand(); + } + } + private EntityColumnInfo GetParentPkColumn() { EntityColumnInfo parentPkColumn = _ParentPkColumn;