InsertNavProviderHelper.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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 InsertNavProvider<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 = GetRootList(_Roots).Cast<object>().ToList();
  20. }
  21. else if (_ParentList == null)
  22. {
  23. _ParentList = _RootList;
  24. var pkColumn = this._Context.EntityMaintenance.GetEntityInfo<T>().Columns.FirstOrDefault(it => it.IsPrimarykey);
  25. this._ParentPkColumn = pkColumn;
  26. }
  27. IsFirst = false;
  28. }
  29. private InsertNavProvider<Root, TChild> GetResult<TChild>() where TChild : class, new()
  30. {
  31. return new InsertNavProvider<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 List<Type> GetRootList<Type>(List<Type> datas) where Type : class, new()
  42. {
  43. List<Type> result = new List<Type>();
  44. this._Context.InitMappingInfo<Type>();
  45. var entity = this._Context.EntityMaintenance.GetEntityInfo<Type>();
  46. var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey);
  47. InsertDatas(datas, pkColumn);
  48. this._ParentEntity = entity;
  49. result = datas;
  50. return result;
  51. }
  52. private void InsertIdentity<Type>(List<Type> datas) where Type : class, new()
  53. {
  54. foreach (var item in datas)
  55. {
  56. if (IsFirst&&_RootOptions!=null)
  57. {
  58. this._Context.Insertable(item)
  59. .IgnoreColumns(_RootOptions.IgnoreColumns)
  60. .InsertColumns(_RootOptions.InsertColumns)
  61. .EnableDiffLogEventIF(_RootOptions.IsDiffLogEvent, _RootOptions.DiffLogBizData)
  62. .ExecuteCommandIdentityIntoEntity();
  63. }
  64. else
  65. {
  66. this._Context.Insertable(item).ExecuteCommandIdentityIntoEntity();
  67. }
  68. }
  69. }
  70. private EntityColumnInfo GetPkColumnByNav(EntityInfo entity,EntityColumnInfo nav)
  71. {
  72. var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
  73. if (nav.Navigat.Name2.HasValue())
  74. {
  75. pkColumn = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name2);
  76. }
  77. return pkColumn;
  78. }
  79. private EntityColumnInfo GetPkColumnByNav2(EntityInfo entity, EntityColumnInfo nav)
  80. {
  81. var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
  82. return pkColumn;
  83. }
  84. private EntityColumnInfo GetFKColumnByNav(EntityInfo entity, EntityColumnInfo nav)
  85. {
  86. var fkColumn = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name);
  87. return fkColumn;
  88. }
  89. private void InsertDatas<TChild>(List<TChild> children, EntityColumnInfo pkColumn, EntityColumnInfo NavColumn=null) where TChild : class, new()
  90. {
  91. children = children.Distinct().ToList();
  92. if (pkColumn == null)
  93. {
  94. Check.ExceptionEasy($"{typeof(TChild).Name} need primary key ", $"{typeof(TChild).Name}需要主键");
  95. }
  96. var x = this._Context.Storageable(children).WhereColumns(new string[] { pkColumn.PropertyName }).GetStorageableResult();
  97. var insertData = children = x.InsertList.Select(it => it.Item).ToList();
  98. var IsNoExistsNoInsert = _navOptions != null && _navOptions.OneToManyIfExistsNoInsert == true;
  99. if (_NavigateType == NavigateType.OneToMany && IsFirst == false && IsNoExistsNoInsert == false)
  100. {
  101. var updateData = x.UpdateList.Select(it => it.Item).ToList();
  102. ClearPk(updateData, pkColumn);
  103. insertData.AddRange(updateData);
  104. }
  105. else if (_NavigateType == NavigateType.OneToMany && IsNoExistsNoInsert == true)
  106. {
  107. children = new List<TChild>();
  108. children.AddRange(x.InsertList.Select(it => it.Item).ToList());
  109. var updateData = x.UpdateList.Select(it => it.Item).ToList();
  110. children.AddRange(updateData);
  111. }
  112. Check.ExceptionEasy(pkColumn==null&&NavColumn==null,$"The entity is invalid",$"实体错误无法使用导航");
  113. InitData(pkColumn, insertData);
  114. this._ParentList = children.Cast<object>().ToList();
  115. }
  116. private void ClearPk<TChild>(List<TChild> updateData, EntityColumnInfo pkColumn) where TChild : class, new()
  117. {
  118. foreach (var child in updateData)
  119. {
  120. var defaultValue =UtilMethods.DefaultForType(pkColumn.PropertyInfo.PropertyType);
  121. pkColumn.PropertyInfo.SetValue(child, defaultValue);
  122. }
  123. }
  124. private void InitData<TChild>(EntityColumnInfo pkColumn, List<TChild> insertData) where TChild : class, new()
  125. {
  126. if (pkColumn.IsIdentity || pkColumn.OracleSequenceName.HasValue())
  127. {
  128. InsertIdentity(insertData);
  129. }
  130. else if (pkColumn.UnderType == UtilConstants.LongType)
  131. {
  132. SetValue(pkColumn, insertData, ()=>SnowFlakeSingle.Instance.NextId());
  133. }
  134. else if (pkColumn.UnderType == UtilConstants.GuidType)
  135. {
  136. SetValue(pkColumn, insertData, () => Guid.NewGuid());
  137. }
  138. else if (pkColumn.UnderType == UtilConstants.StringType)
  139. {
  140. SetValue(pkColumn, insertData, () => Guid.NewGuid().ToString());
  141. }
  142. else
  143. {
  144. SetError(pkColumn, insertData);
  145. }
  146. }
  147. private void SetValue<TChild>(EntityColumnInfo pkColumn, List<TChild> insertData,Func<object> value) where TChild : class, new()
  148. {
  149. foreach (var child in insertData)
  150. {
  151. if (IsDefaultValue(pkColumn.PropertyInfo.GetValue(child)))
  152. {
  153. pkColumn.PropertyInfo.SetValue(child, value());
  154. }
  155. }
  156. if (IsFirst && _RootOptions != null)
  157. {
  158. this._Context.Insertable(insertData)
  159. .IgnoreColumns(_RootOptions.IgnoreColumns)
  160. .InsertColumns(_RootOptions.InsertColumns)
  161. .EnableDiffLogEventIF(_RootOptions.IsDiffLogEvent, _RootOptions.DiffLogBizData)
  162. .ExecuteCommand();
  163. }
  164. else
  165. {
  166. this._Context.Insertable(insertData).ExecuteCommand();
  167. }
  168. }
  169. private void SetError<TChild>(EntityColumnInfo pkColumn, List<TChild> insertData) where TChild : class, new()
  170. {
  171. foreach (var child in insertData)
  172. {
  173. if (IsDefaultValue(pkColumn.PropertyInfo.GetValue(child)))
  174. {
  175. var name = pkColumn.EntityName + " " + pkColumn.DbColumnName;
  176. Check.ExceptionEasy($"The field {name} is not an autoassignment type and requires an assignment", $"字段{name}不是可自动赋值类型需要赋值(并且不能是已存在值) , 可赋值类型有 自增、long、Guid、string");
  177. }
  178. }
  179. if (IsFirst && _RootOptions != null)
  180. {
  181. this._Context.Insertable(insertData)
  182. .IgnoreColumns(_RootOptions.IgnoreColumns)
  183. .InsertColumns(_RootOptions.InsertColumns)
  184. .EnableDiffLogEventIF(_RootOptions.IsDiffLogEvent, _RootOptions.DiffLogBizData)
  185. .ExecuteCommand();
  186. }
  187. else
  188. {
  189. this._Context.Insertable(insertData).ExecuteCommand();
  190. }
  191. }
  192. }
  193. }