UpdateNavProviderHelper.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace SqlSugar
  8. {
  9. public partial class UpdateNavProvider<Root, T> where T : class, new() where Root : class, new()
  10. {
  11. private static bool IsDefaultValue(object pvValue)
  12. {
  13. return pvValue == null || pvValue.Equals(UtilMethods.GetDefaultValue(pvValue.GetType()));
  14. }
  15. private void InitParentList()
  16. {
  17. if (_RootList == null)
  18. {
  19. _RootList = _ParentList = _Roots.Cast<object>().ToList();
  20. _ParentEntity = this._Context.EntityMaintenance.GetEntityInfo<Root>();
  21. }
  22. else if (_ParentList == null)
  23. {
  24. _ParentList = _RootList;
  25. var pkColumn = this._Context.EntityMaintenance.GetEntityInfo<T>().Columns.FirstOrDefault(it => it.IsPrimarykey);
  26. this._ParentPkColumn = pkColumn;
  27. }
  28. }
  29. private UpdateNavProvider<Root, TChild> GetResult<TChild>() where TChild : class, new()
  30. {
  31. return new UpdateNavProvider<Root, TChild>()
  32. {
  33. _Context = this._Context,
  34. _ParentEntity = this._ParentEntity,
  35. _ParentList = this._ParentList,
  36. _Roots = this._Roots,
  37. _ParentPkColumn = this._ParentPkColumn,
  38. _RootList = this._RootList
  39. };
  40. }
  41. private void InsertIdentity<Type>(List<Type> datas) where Type : class, new()
  42. {
  43. foreach (var item in datas)
  44. {
  45. this._Context.Insertable(item).ExecuteCommandIdentityIntoEntity();
  46. }
  47. }
  48. private EntityColumnInfo GetPkColumnByNav(EntityInfo entity, EntityColumnInfo nav)
  49. {
  50. var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
  51. if (nav.Navigat.Name2.HasValue())
  52. {
  53. pkColumn = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name2);
  54. }
  55. return pkColumn;
  56. }
  57. private EntityColumnInfo GetPkColumnByNav2(EntityInfo entity, EntityColumnInfo nav)
  58. {
  59. var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
  60. return pkColumn;
  61. }
  62. private EntityColumnInfo GetFKColumnByNav(EntityInfo entity, EntityColumnInfo nav)
  63. {
  64. var fkColumn = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name);
  65. return fkColumn;
  66. }
  67. private void InsertDatas<TChild>(List<TChild> children, EntityColumnInfo pkColumn, EntityColumnInfo NavColumn = null) where TChild : class, new()
  68. {
  69. children = children.Distinct().ToList();
  70. var x = this._Context.Storageable(children).WhereColumns(new string[] { pkColumn.PropertyName }).ToStorage();
  71. var insertData = x.InsertList.Select(it => it.Item).ToList();
  72. var updateData = x.UpdateList.Select(it => it.Item).ToList();
  73. Check.ExceptionEasy(pkColumn == null && NavColumn == null, $"The entity is invalid", $"实体错误无法使用导航");
  74. if (_Options != null && _Options.CurrentFunc != null)
  75. {
  76. var updateable = x.AsUpdateable;
  77. var exp = _Options.CurrentFunc as Expression<Action<IUpdateable<TChild>>>;
  78. Check.ExceptionEasy(exp == null, "UpdateOptions.CurrentFunc is error", "UpdateOptions.CurrentFunc参数设置错误");
  79. var com = exp.Compile();
  80. com(updateable);
  81. if (IsDeleted)
  82. {
  83. updateable.PageSize(1).EnableQueryFilter().ExecuteCommand();
  84. }
  85. else
  86. {
  87. updateable.ExecuteCommand();
  88. }
  89. }
  90. else if (pkColumn.IsPrimarykey == false)
  91. {
  92. var pk= this._Context.EntityMaintenance.GetEntityInfo<TChild>().Columns.Where(it => it.IsPrimarykey);
  93. List<string> ignoreColumns = new List<string>();
  94. if (_Options?.IgnoreColumns != null)
  95. {
  96. ignoreColumns.AddRange(_Options.IgnoreColumns);
  97. }
  98. if (pk.Any())
  99. {
  100. ignoreColumns.AddRange(pk.Select(it=>it.PropertyName));
  101. }
  102. if (IsDeleted)
  103. {
  104. x.AsUpdateable.IgnoreColumns(ignoreColumns.ToArray()).PageSize(1).EnableQueryFilter().ExecuteCommand();
  105. }
  106. else
  107. {
  108. x.AsUpdateable.IgnoreColumns(ignoreColumns.ToArray()).ExecuteCommand();
  109. }
  110. }
  111. else
  112. {
  113. var ignoreColumns = _Options?.IgnoreColumns;
  114. if (IsDeleted)
  115. {
  116. x.AsUpdateable.IgnoreColumns(ignoreColumns?.ToArray()).PageSize(1).EnableQueryFilter().ExecuteCommand();
  117. }
  118. else
  119. {
  120. x.AsUpdateable.IgnoreColumns(ignoreColumns?.ToArray()).ExecuteCommand();
  121. }
  122. }
  123. InitData(pkColumn, insertData);
  124. if (_NavigateType == NavigateType.OneToMany)
  125. {
  126. this._ParentList = children.Cast<object>().ToList();
  127. }
  128. else
  129. {
  130. this._ParentList = insertData.Union(updateData).Cast<object>().ToList();
  131. }
  132. }
  133. private void InitData<TChild>(EntityColumnInfo pkColumn, List<TChild> UpdateData) where TChild : class, new()
  134. {
  135. if (pkColumn.IsIdentity || pkColumn.OracleSequenceName.HasValue())
  136. {
  137. InsertIdentity(UpdateData);
  138. }
  139. else if (pkColumn.UnderType == UtilConstants.LongType)
  140. {
  141. SetValue(pkColumn, UpdateData, () => SnowFlakeSingle.Instance.NextId());
  142. }
  143. else if (pkColumn.UnderType == UtilConstants.GuidType)
  144. {
  145. SetValue(pkColumn, UpdateData, () => Guid.NewGuid());
  146. }
  147. else if (pkColumn.UnderType == UtilConstants.StringType)
  148. {
  149. SetValue(pkColumn, UpdateData, () => Guid.NewGuid().ToString());
  150. }
  151. else
  152. {
  153. SetError(pkColumn, UpdateData);
  154. }
  155. }
  156. private void SetValue<TChild>(EntityColumnInfo pkColumn, List<TChild> UpdateData, Func<object> value) where TChild : class, new()
  157. {
  158. foreach (var child in UpdateData)
  159. {
  160. if (IsDefaultValue(pkColumn.PropertyInfo.GetValue(child)))
  161. {
  162. pkColumn.PropertyInfo.SetValue(child, value());
  163. }
  164. }
  165. this._Context.Insertable(UpdateData).ExecuteCommand();
  166. }
  167. private void SetError<TChild>(EntityColumnInfo pkColumn, List<TChild> UpdateData) where TChild : class, new()
  168. {
  169. foreach (var child in UpdateData)
  170. {
  171. if (IsDefaultValue(pkColumn.PropertyInfo.GetValue(child)))
  172. {
  173. var name = pkColumn.EntityName + " " + pkColumn.DbColumnName;
  174. Check.ExceptionEasy($"The field {name} is not an autoassignment type and requires an assignment", $"字段{name}不是可自动赋值类型,需要赋值 , 可赋值类型有 自增、long、Guid、string");
  175. }
  176. }
  177. this._Context.Insertable(UpdateData).ExecuteCommand();
  178. }
  179. }
  180. }