DeleteNavManyToMany.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace SqlSugar
  7. {
  8. public partial class DeleteNavProvider<Root, T> where T : class, new() where Root : class, new()
  9. {
  10. private void DeleteManyToMany<TChild>(string name, EntityColumnInfo nav) where TChild : class, new()
  11. {
  12. var parentEntity = _ParentEntity;
  13. var parentList = _ParentList.Cast<T>().ToList();
  14. var parentPkColumn = parentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
  15. var parentNavigateProperty = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == name);
  16. var thisEntity = this._Context.EntityMaintenance.GetEntityInfo<TChild>();
  17. var thisPkColumn = thisEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
  18. Check.ExceptionEasy(thisPkColumn == null, $"{thisPkColumn.EntityName} need primary key", $"{thisPkColumn.EntityName}需要主键");
  19. Check.ExceptionEasy(parentPkColumn == null, $"{parentPkColumn.EntityName} need primary key", $"{parentPkColumn.EntityName}需要主键");
  20. var mappingType = parentNavigateProperty.Navigat.MappingType;
  21. var mappingEntity = this._Context.EntityMaintenance.GetEntityInfo(mappingType);
  22. var mappingA = mappingEntity.Columns.FirstOrDefault(x => x.PropertyName == parentNavigateProperty.Navigat.MappingAId);
  23. var mappingB = mappingEntity.Columns.FirstOrDefault(x => x.PropertyName == parentNavigateProperty.Navigat.MappingBId);
  24. Check.ExceptionEasy(mappingA == null || mappingB == null, $"Navigate property {name} error ", $"导航属性{name}配置错误");
  25. var mappingPk = mappingEntity.Columns
  26. .Where(it => it.PropertyName != mappingA.PropertyName)
  27. .Where(it => it.PropertyName != mappingB.PropertyName)
  28. .Where(it => it.IsPrimarykey && !it.IsIdentity && it.OracleSequenceName.IsNullOrEmpty()).FirstOrDefault();
  29. if (IsDeleteA())
  30. {
  31. if (!_IsDeletedParant)
  32. SetContext(() => this._Context.Deleteable(parentList)
  33. .EnableDiffLogEventIF(_RootOptions?.IsDiffLogEvent == true, _RootOptions?.DiffLogBizData)
  34. .ExecuteCommand());
  35. }
  36. var aids = _ParentList.Select(it => parentPkColumn.PropertyInfo.GetValue(it)).ToList();
  37. var bids = _Context.Queryable<object>().Filter(mappingEntity.Type).AS(mappingEntity.DbTableName).In(mappingA.DbColumnName, aids)
  38. .Select(mappingB.DbColumnName).ToDataTable()
  39. .Rows.Cast<System.Data.DataRow>().Select(it => it[0]).ToList();
  40. var childList = GetChildList<TChild>().In(thisPkColumn.DbColumnName, bids).ToList();
  41. if (_WhereList.HasValue())
  42. {
  43. bids = childList.Select(it => thisPkColumn.PropertyInfo.GetValue(it)).ToList();
  44. }
  45. if (IsDeleteB())
  46. {
  47. SetContext(() => _Context.Deleteable(childList).ExecuteCommand());
  48. }
  49. this._ParentList = childList.Cast<object>().ToList();
  50. this._ParentPkColumn = thisPkColumn;
  51. this._IsDeletedParant = true;
  52. if (_WhereList.HasValue())
  53. {
  54. SetContext(() => _Context.Deleteable<object>().AS(mappingEntity.DbTableName)
  55. .In(mappingA.DbColumnName, aids)
  56. .In(mappingB.DbColumnName, bids)
  57. .ExecuteCommand());
  58. }
  59. else
  60. {
  61. SetContext(() => _Context.Deleteable<object>().AS(mappingEntity.DbTableName).In(
  62. mappingA.DbColumnName, aids
  63. ).ExecuteCommand());
  64. }
  65. }
  66. private bool IsDeleteA()
  67. {
  68. return deleteNavOptions != null && deleteNavOptions.ManyToManyIsDeleteA;
  69. }
  70. private bool IsDeleteB()
  71. {
  72. return deleteNavOptions != null && deleteNavOptions.ManyToManyIsDeleteB;
  73. }
  74. }
  75. }