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 UpdateNavProvider where T : class, new() where Root : class, new() { private static bool IsDefaultValue(object pvValue) { return pvValue == null || pvValue.Equals(UtilMethods.GetDefaultValue(pvValue.GetType())); } private void InitParentList() { if (_RootList == null) { _RootList = _ParentList = _Roots.Cast().ToList(); _ParentEntity = this._Context.EntityMaintenance.GetEntityInfo(); } else if (_ParentList == null) { _ParentList = _RootList; var pkColumn = this._Context.EntityMaintenance.GetEntityInfo().Columns.FirstOrDefault(it => it.IsPrimarykey); this._ParentPkColumn = pkColumn; } } private UpdateNavProvider GetResult() where TChild : class, new() { return new UpdateNavProvider() { _Context = this._Context, _ParentEntity = this._ParentEntity, _ParentList = this._ParentList, _Roots = this._Roots, _ParentPkColumn = this._ParentPkColumn, _RootList = this._RootList }; } 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 = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name2); } return pkColumn; } private EntityColumnInfo GetPkColumnByNav2(EntityInfo entity, EntityColumnInfo nav) { var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey == true); 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, EntityColumnInfo NavColumn = null) where TChild : class, new() { children = children.Distinct().ToList(); Check.ExceptionEasy(pkColumn == null, typeof(TChild).Name + " has no primary key", typeof(TChild).Name + "没有主键"); var whereName = pkColumn.PropertyName; if (_Options?.OneToOneSaveByPrimaryKey==true&& pkColumn.IsPrimarykey==false) { var newPkColumn=this._Context.EntityMaintenance.GetEntityInfo().Columns.FirstOrDefault(it => it.IsPrimarykey); if (newPkColumn != null) { whereName = newPkColumn.PropertyName; } } ; var x = this._Context.Storageable(children).WhereColumns(new string[] {whereName}).ToStorage(); var insertData = x.InsertList.Select(it => it.Item).ToList(); var updateData = x.UpdateList.Select(it => it.Item).ToList(); Check.ExceptionEasy(pkColumn == null && NavColumn == null, $"The entity is invalid", $"实体错误无法使用导航"); if (_Options != null && _Options.CurrentFunc != null) { var updateable = x.AsUpdateable; var exp = _Options.CurrentFunc as Expression>>; Check.ExceptionEasy(exp == null, "UpdateOptions.CurrentFunc is error", "UpdateOptions.CurrentFunc参数设置错误"); var com = exp.Compile(); com(updateable); if (IsDeleted) { updateable.PageSize(1).EnableQueryFilter().ExecuteCommand(); } else { updateable.ExecuteCommand(); } } else if (pkColumn.IsPrimarykey == false) { var pk= this._Context.EntityMaintenance.GetEntityInfo().Columns.Where(it => it.IsPrimarykey); List ignoreColumns = new List(); if (_Options?.IgnoreColumns != null) { ignoreColumns.AddRange(_Options.IgnoreColumns); } if (pk.Any()) { ignoreColumns.AddRange(pk.Select(it=>it.PropertyName)); } if (_Options?.OneToOneSaveByPrimaryKey==true) { ignoreColumns = ignoreColumns.Where(it => it != whereName).ToList(); } if (IsDeleted) { x.AsUpdateable.IgnoreColumns(ignoreColumns.ToArray()).PageSize(1).EnableQueryFilter().ExecuteCommand(); } else { x.AsUpdateable.IgnoreColumns(ignoreColumns.ToArray()).ExecuteCommand(); } } else { var ignoreColumns = _Options?.IgnoreColumns; var isIgnoreNull = _Options?.IgnoreNullColumns == true; if (IsDeleted) { x.AsUpdateable.IgnoreNullColumns(isIgnoreNull).IgnoreColumns(ignoreColumns?.ToArray()).PageSize(1).EnableQueryFilter().ExecuteCommand(); } else { x.AsUpdateable.IgnoreNullColumns(isIgnoreNull).IgnoreColumns(ignoreColumns?.ToArray()).ExecuteCommand(); } } InitData(pkColumn, insertData); if (_NavigateType == NavigateType.OneToMany) { this._ParentList = children.Cast().ToList(); } else { this._ParentList = insertData.Union(updateData).Cast().ToList(); } } private void InitData(EntityColumnInfo pkColumn, List UpdateData) where TChild : class, new() { if (pkColumn.IsIdentity || pkColumn.OracleSequenceName.HasValue()) { InsertIdentity(UpdateData); } else if (pkColumn.UnderType == UtilConstants.LongType) { SetValue(pkColumn, UpdateData, () => SnowFlakeSingle.Instance.NextId()); } else if (pkColumn.UnderType == UtilConstants.GuidType) { SetValue(pkColumn, UpdateData, () => Guid.NewGuid()); } else if (pkColumn.UnderType == UtilConstants.StringType) { SetValue(pkColumn, UpdateData, () => Guid.NewGuid().ToString()); } else { SetError(pkColumn, UpdateData); } } private void SetValue(EntityColumnInfo pkColumn, List UpdateData, Func value) where TChild : class, new() { foreach (var child in UpdateData) { if (IsDefaultValue(pkColumn.PropertyInfo.GetValue(child))) { pkColumn.PropertyInfo.SetValue(child, value()); } } this._Context.Insertable(UpdateData).ExecuteCommand(); } private void SetError(EntityColumnInfo pkColumn, List UpdateData) where TChild : class, new() { foreach (var child in UpdateData) { if (IsDefaultValue(pkColumn.PropertyInfo.GetValue(child))) { var name = pkColumn.EntityName + " " + pkColumn.DbColumnName; Check.ExceptionEasy($"The field {name} is not an autoassignment type and requires an assignment", $"字段{name}不是可自动赋值类型,需要赋值 , 可赋值类型有 自增、long、Guid、string"); } } this._Context.Insertable(UpdateData).ExecuteCommand(); } } }