TDengineCodeFirst.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. namespace SqlSugar.BzTDengineCore
  7. {
  8. public class TDengineCodeFirst : CodeFirstProvider
  9. {
  10. public override void ExistLogic(EntityInfo entityInfo)
  11. {
  12. if (entityInfo.Columns.HasValue() && entityInfo.IsDisabledUpdateAll == false)
  13. {
  14. //Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Multiple primary keys do not support modifications");
  15. var tableName = GetTableName(entityInfo);
  16. var dbColumns = Context.DbMaintenance.GetColumnInfosByTableName(tableName, false);
  17. ConvertColumns(dbColumns);
  18. var entityColumns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList();
  19. var dropColumns = dbColumns
  20. .Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  21. .Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.DbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  22. .ToList();
  23. var addColumns = entityColumns
  24. .Where(ec => ec.OldDbColumnName.IsNullOrEmpty() || !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  25. .Where(ec => !dbColumns.Any(dc => ec.DbColumnName.Equals(dc.DbColumnName, StringComparison.CurrentCultureIgnoreCase))).ToList();
  26. var renameColumns = entityColumns
  27. .Where(it => !string.IsNullOrEmpty(it.OldDbColumnName))
  28. .Where(entityColumn => dbColumns.Any(dbColumn => entityColumn.OldDbColumnName.Equals(dbColumn.DbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  29. .ToList();
  30. var isMultiplePrimaryKey = dbColumns.Where(it => it.IsPrimarykey).Count() > 1 || entityColumns.Where(it => it.IsPrimarykey).Count() > 1;
  31. var isChange = false;
  32. foreach (var item in addColumns)
  33. {
  34. Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
  35. isChange = true;
  36. }
  37. if (entityInfo.IsDisabledDelete == false)
  38. {
  39. foreach (var item in dropColumns)
  40. {
  41. Context.DbMaintenance.DropColumn(tableName, item.DbColumnName);
  42. isChange = true;
  43. }
  44. }
  45. //foreach (var item in alterColumns)
  46. //{
  47. // if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
  48. // {
  49. // var entityColumnItem = entityColumns.FirstOrDefault(y => y.DbColumnName == item.DbColumnName);
  50. // if (entityColumnItem != null && !string.IsNullOrEmpty(entityColumnItem.DataType))
  51. // {
  52. // continue;
  53. // }
  54. // }
  55. // this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
  56. // isChange = true;
  57. //}
  58. foreach (var item in renameColumns)
  59. {
  60. Context.DbMaintenance.RenameColumn(tableName, item.OldDbColumnName, item.DbColumnName);
  61. isChange = true;
  62. }
  63. //var isAddPrimaryKey = false;
  64. //foreach (var item in entityColumns)
  65. //{
  66. // var dbColumn = dbColumns.FirstOrDefault(dc => dc.DbColumnName.Equals(item.DbColumnName, StringComparison.CurrentCultureIgnoreCase));
  67. // if (dbColumn == null) continue;
  68. // bool pkDiff, idEntityDiff;
  69. // KeyAction(item, dbColumn, out pkDiff, out idEntityDiff);
  70. // if (dbColumn != null && pkDiff && !idEntityDiff && isMultiplePrimaryKey == false)
  71. // {
  72. // var isAdd = item.IsPrimarykey;
  73. // if (isAdd)
  74. // {
  75. // isAddPrimaryKey = true;
  76. // this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
  77. // }
  78. // else
  79. // {
  80. // this.Context.DbMaintenance.DropConstraint(tableName, string.Format("PK_{0}_{1}", tableName, item.DbColumnName));
  81. // }
  82. // }
  83. // else if ((pkDiff || idEntityDiff) && isMultiplePrimaryKey == false)
  84. // {
  85. // ChangeKey(entityInfo, tableName, item);
  86. // }
  87. //}
  88. //if (isAddPrimaryKey == false && entityColumns.Count(it => it.IsPrimarykey) == 1 && dbColumns.Count(it => it.IsPrimarykey) == 0)
  89. //{
  90. // //var addPk = entityColumns.First(it => it.IsPrimarykey);
  91. // //this.Context.DbMaintenance.AddPrimaryKey(tableName, addPk.DbColumnName);
  92. //}
  93. //if (isMultiplePrimaryKey)
  94. //{
  95. // var oldPkNames = dbColumns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName.ToLower()).OrderBy(it => it).ToList();
  96. // var newPkNames = entityColumns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName.ToLower()).OrderBy(it => it).ToList();
  97. // if (!Enumerable.SequenceEqual(oldPkNames, newPkNames))
  98. // {
  99. // Check.Exception(true, ErrorMessage.GetThrowMessage("Modification of multiple primary key tables is not supported. Delete tables while creating", "不支持修改多主键表,请删除表在创建"));
  100. // }
  101. //}
  102. if (isChange && IsBackupTable)
  103. {
  104. Context.DbMaintenance.BackupTable(tableName, tableName + DateTime.Now.ToString("yyyyMMddHHmmss"), MaxBackupDataRows);
  105. }
  106. ExistLogicEnd(entityColumns);
  107. }
  108. }
  109. public override void NoExistLogic(EntityInfo entityInfo)
  110. {
  111. List<DbColumnInfo> dbColumns = new List<DbColumnInfo>();
  112. foreach (var item in entityInfo.Columns.Where(it => it.PropertyName != "TagsTypeId").OrderBy(it => it.UnderType == typeof(DateTime) ? 0 : 1))
  113. {
  114. var addItem = EntityColumnToDbColumn(entityInfo, entityInfo.DbTableName, item);
  115. dbColumns.Add(addItem);
  116. }
  117. Context.DbMaintenance.CreateTable(entityInfo.DbTableName, dbColumns);
  118. }
  119. protected override DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
  120. {
  121. DbColumnInfo result = new DbColumnInfo() { Length = item.Length, DecimalDigits = item.DecimalDigits, Scale = item.DecimalDigits, TableName = tableName, DbColumnName = item.DbColumnName, DataType = item.DataType };
  122. if (result.DataType.IsNullOrEmpty())
  123. {
  124. result.DataType = GetDatabaseTypeName(item.UnderType.Name);
  125. }
  126. return result;
  127. }
  128. public string GetDatabaseTypeName(string typeName)
  129. {
  130. switch (typeName.ToLower())
  131. {
  132. case "bool":
  133. return "BOOL";
  134. case "datetime":
  135. return "TIMESTAMP";
  136. case "boolean":
  137. return "BOOL";
  138. case "byte":
  139. return "TINYINT UNSIGNED";
  140. case "sbyte":
  141. return "TINYINT";
  142. case "char":
  143. return "NCHAR";
  144. case "decimal":
  145. return "FLOAT";
  146. case "double":
  147. return "DOUBLE";
  148. case "float":
  149. return "FLOAT";
  150. case "int":
  151. return "INT";
  152. case "int32":
  153. return "INT";
  154. case "int16":
  155. return "INT";
  156. case "int64":
  157. return "BIGINT";
  158. case "uint":
  159. return "INT UNSIGNED";
  160. case "long":
  161. return "BIGINT";
  162. case "ulong":
  163. return "BIGINT UNSIGNED";
  164. case "short":
  165. return "SMALLINT";
  166. case "ushort":
  167. return "SMALLINT UNSIGNED";
  168. case "string":
  169. return "VARCHAR";
  170. // 添加其他类型的映射关系
  171. default:
  172. return "VARCHAR"; // 如果未识别到类型,则返回原始类型名称
  173. }
  174. }
  175. }
  176. }