InsertNavProviderOneToMany.cs 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 void InsertOneToMany<TChild>(string name, EntityColumnInfo nav) where TChild : class, new()
  12. {
  13. List<TChild> children = new List<TChild>();
  14. var parentEntity = _ParentEntity;
  15. var parentList = _ParentList;
  16. var parentNavigateProperty = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == name);
  17. var thisEntity = this._Context.EntityMaintenance.GetEntityInfo<TChild>();
  18. var thisPkColumn = GetPkColumnByNav2(thisEntity, nav);
  19. var thisFkColumn = GetFKColumnByNav(thisEntity, nav);
  20. EntityColumnInfo parentPkColumn = GetParentPkColumn();
  21. EntityColumnInfo parentNavColumn = GetParentPkNavColumn(nav);
  22. if (parentNavColumn != null)
  23. {
  24. parentPkColumn = parentNavColumn;
  25. }
  26. if (ParentIsPk(parentNavigateProperty))
  27. {
  28. parentPkColumn = this._ParentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey);
  29. }
  30. foreach (var item in parentList)
  31. {
  32. var parentValue = parentPkColumn.PropertyInfo.GetValue(item);
  33. var childs = parentNavigateProperty.PropertyInfo.GetValue(item) as List<TChild>;
  34. if (childs != null)
  35. {
  36. foreach (var child in childs)
  37. {
  38. thisFkColumn.PropertyInfo.SetValue(child, parentValue, null);
  39. }
  40. children.AddRange(childs);
  41. }
  42. }
  43. var isTreeChild = GetIsTreeChild(parentEntity, thisEntity);
  44. Check.ExceptionEasy(thisPkColumn == null, $"{thisEntity.EntityName}need primary key", $"实体{thisEntity.EntityName}需要主键");
  45. if (NotAny(name) || isTreeChild)
  46. {
  47. InsertDatas(children, thisPkColumn);
  48. }
  49. else
  50. {
  51. this._ParentList = children.Cast<object>().ToList();
  52. }
  53. SetNewParent<TChild>(thisEntity, thisPkColumn);
  54. }
  55. private bool GetIsTreeChild(EntityInfo parentEntity , EntityInfo thisEntity)
  56. {
  57. return this.NavContext?.Items?.Any() == true && parentEntity.Type == thisEntity.Type;
  58. }
  59. private static bool ParentIsPk(EntityColumnInfo parentNavigateProperty)
  60. {
  61. return parentNavigateProperty != null &&
  62. parentNavigateProperty.Navigat != null &&
  63. parentNavigateProperty.Navigat.NavigatType == NavigateType.OneToMany &&
  64. parentNavigateProperty.Navigat.Name2==null;
  65. }
  66. private EntityColumnInfo GetParentPkColumn()
  67. {
  68. EntityColumnInfo parentPkColumn = _ParentPkColumn;
  69. if (_ParentPkColumn == null)
  70. {
  71. parentPkColumn= _ParentPkColumn = this._ParentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey);
  72. }
  73. return parentPkColumn;
  74. }
  75. private EntityColumnInfo GetParentPkNavColumn(EntityColumnInfo nav)
  76. {
  77. EntityColumnInfo result = null;
  78. if (nav.Navigat.Name2.HasValue())
  79. {
  80. result = _ParentPkColumn = this._ParentEntity.Columns.FirstOrDefault(it => it.PropertyName== nav.Navigat.Name2);
  81. }
  82. return result;
  83. }
  84. private void SetNewParent<TChild>(EntityInfo entityInfo,EntityColumnInfo entityColumnInfo) where TChild : class, new()
  85. {
  86. this._ParentEntity = entityInfo;
  87. this._ParentPkColumn = entityColumnInfo;
  88. }
  89. }
  90. }