TableDifferenceProvider.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Linq;
  5. namespace SqlSugar
  6. {
  7. public class TableDifferenceProvider
  8. {
  9. internal List<DiffTableInfo> tableInfos = new List<DiffTableInfo>();
  10. public string ToDiffString()
  11. {
  12. StringBuilder sb = new StringBuilder();
  13. sb.AppendLine();
  14. var diffTables = this.ToDiffList();
  15. if (diffTables.IsNullOrEmpty())
  16. {
  17. sb.AppendLine("No change");
  18. }
  19. else
  20. {
  21. foreach (var item in diffTables)
  22. {
  23. sb.AppendLine($"----Table:{ item.TableName }----");
  24. if (item.AddColums.HasValue())
  25. {
  26. sb.AppendLine($"Add column: ");
  27. foreach (var addItem in item.AddColums)
  28. {
  29. sb.AppendLine($"{addItem.Message} ");
  30. }
  31. }
  32. if (item.UpdateColums.HasValue())
  33. {
  34. sb.AppendLine($"Update column: ");
  35. foreach (var addItem in item.UpdateColums)
  36. {
  37. sb.AppendLine($"{addItem.Message} ");
  38. }
  39. }
  40. if (item.DeleteColums.HasValue())
  41. {
  42. sb.AppendLine($"Delete column: ");
  43. foreach (var addItem in item.DeleteColums)
  44. {
  45. sb.AppendLine($"{addItem.Message} ");
  46. }
  47. }
  48. }
  49. }
  50. sb.AppendLine();
  51. sb.AppendLine();
  52. return sb.ToString();
  53. }
  54. public List<TableDifferenceInfo> ToDiffList()
  55. {
  56. List<TableDifferenceInfo> result = new List<TableDifferenceInfo>();
  57. foreach (var tableInfo in tableInfos)
  58. {
  59. TableDifferenceInfo addItem = new TableDifferenceInfo();
  60. if (tableInfo.OldTableInfo == null)
  61. tableInfo.OldTableInfo = new DbTableInfo();
  62. addItem.TableName = tableInfo.OldTableInfo.Name;
  63. addItem.AddColums = GetAddColumn(tableInfo);
  64. addItem.UpdateColums = GetUpdateColumn(tableInfo);
  65. addItem.DeleteColums = GetDeleteColumn(tableInfo);
  66. if (addItem.IsDiff)
  67. result.Add(addItem);
  68. }
  69. return result;
  70. }
  71. private static List<DiffColumsInfo> GetDeleteColumn(DiffTableInfo tableInfo)
  72. {
  73. List<DiffColumsInfo> result = new List<DiffColumsInfo>();
  74. var columns = tableInfo.OldColumnInfos.Where(z => !tableInfo.NewColumnInfos.Any(y => y.DbColumnName.EqualCase(z.DbColumnName))).ToList();
  75. return columns.Select(it => new DiffColumsInfo() { Message= GetColumnString(it) }).ToList();
  76. }
  77. private List<DiffColumsInfo> GetUpdateColumn(DiffTableInfo tableInfo)
  78. {
  79. List<DiffColumsInfo> result = new List<DiffColumsInfo>();
  80. result = tableInfo.NewColumnInfos
  81. .Where(z => tableInfo.OldColumnInfos.Any(y => y.DbColumnName.EqualCase(z.DbColumnName) && (
  82. z.Length != y.Length ||
  83. z.ColumnDescription != y.ColumnDescription ||
  84. z.DataType != y.DataType ||
  85. z.DecimalDigits != y.DecimalDigits
  86. ))).Select(it => new DiffColumsInfo()
  87. {
  88. Message= GetUpdateColumnString(it, tableInfo.OldColumnInfos.FirstOrDefault(y => y.DbColumnName.EqualCase(it.DbColumnName)))
  89. }).ToList();
  90. return result;
  91. }
  92. private static List<DiffColumsInfo> GetAddColumn(DiffTableInfo tableInfo)
  93. {
  94. List<DiffColumsInfo> result = new List<DiffColumsInfo>();
  95. var columns = tableInfo.NewColumnInfos.Where(z => !tableInfo.OldColumnInfos.Any(y => y.DbColumnName.EqualCase(z.DbColumnName))).ToList();
  96. return columns.Select(it => new DiffColumsInfo() { Message = GetColumnString(it) }).ToList();
  97. }
  98. private static string GetColumnString(DbColumnInfo it)
  99. {
  100. return $"{it.DbColumnName} {it.DataType} {it.Length} {it.Scale} default:{it.DefaultValue} description:{it.ColumnDescription} pk:{it.IsPrimarykey} nullable:{it.IsNullable} identity:{it.IsIdentity} ";
  101. }
  102. private static string GetUpdateColumnString(DbColumnInfo it,DbColumnInfo old)
  103. {
  104. var result= $"{it.DbColumnName} changes: ";
  105. if (it.DataType != old.DataType)
  106. {
  107. result += $" [DataType:{old.DataType}->{it.DataType}] ";
  108. }
  109. if (it.Length != old.Length)
  110. {
  111. result += $" [Length:{old.Length}->{it.Length}] ";
  112. }
  113. if (it.Scale != old.Scale)
  114. {
  115. result += $" [Scale:{old.Scale}->{it.Scale}] ";
  116. }
  117. if (it.ColumnDescription != old.ColumnDescription)
  118. {
  119. result += $" [Description:{old.ColumnDescription}->{it.ColumnDescription}] ";
  120. }
  121. if (it.IsPrimarykey != old.IsPrimarykey)
  122. {
  123. result += $" [Pk:{old.IsPrimarykey}->{it.IsPrimarykey}] ";
  124. }
  125. if (it.IsNullable != old.IsNullable)
  126. {
  127. result += $" [Nullable:{old.IsNullable}->{it.IsNullable}] ";
  128. }
  129. if (it.IsIdentity != old.IsIdentity)
  130. {
  131. result += $" [Identity:{old.IsIdentity}->{it.IsIdentity}] ";
  132. }
  133. return result;
  134. }
  135. }
  136. public class TableDifferenceInfo
  137. {
  138. public List<DiffColumsInfo> DeleteColums { get; set; } = new List<DiffColumsInfo>();
  139. public List<DiffColumsInfo> UpdateColums { get; set; } = new List<DiffColumsInfo>();
  140. public List<DiffColumsInfo> AddColums { get; set; } = new List<DiffColumsInfo>();
  141. public List<DiffColumsInfo> UpdateRemark { get; set; } = new List<DiffColumsInfo>();
  142. public bool IsDiff
  143. {
  144. get
  145. {
  146. return
  147. (DeleteColums.Count>0 ||
  148. UpdateColums.Count > 0 ||
  149. AddColums.Count > 0 ||
  150. UpdateRemark.Count > 0) ;
  151. }
  152. }
  153. public string TableName { get; set; }
  154. }
  155. public class DiffColumsInfo
  156. {
  157. public string SqlTemplate { get; set; }
  158. public string Message { get; set; }
  159. }
  160. public class DiffTableInfo
  161. {
  162. public DbTableInfo OldTableInfo { get; set; }
  163. public DbTableInfo NewTableInfo { get; set; }
  164. public List<DbColumnInfo> OldColumnInfos { get; set; }
  165. public List<DbColumnInfo> NewColumnInfos { get; set; }
  166. }
  167. }