SqliteCodeFirst.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace SqlSugar
  6. {
  7. public class SqliteCodeFirst : CodeFirstProvider
  8. {
  9. public override void ExistLogic(EntityInfo entityInfo)
  10. {
  11. if (entityInfo.Columns.HasValue()&&entityInfo.IsDisabledUpdateAll==false)
  12. {
  13. if (entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1)
  14. {
  15. AddColumn(entityInfo);
  16. return;
  17. }
  18. var tableName = GetTableName(entityInfo);
  19. var dbColumns = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName,false);
  20. ConvertColumns(dbColumns);
  21. var entityColumns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList();
  22. var dropColumns = dbColumns
  23. .Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  24. .Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.DbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  25. .ToList();
  26. var addColumns = entityColumns
  27. .Where(ec => ec.OldDbColumnName.IsNullOrEmpty() || !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  28. .Where(ec => !dbColumns.Any(dc => ec.DbColumnName.Equals(dc.DbColumnName, StringComparison.CurrentCultureIgnoreCase))).ToList();
  29. //var alterColumns = entityColumns
  30. // .Where(ec => !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  31. // .Where(ec =>
  32. // dbColumns.Any(dc => dc.DbColumnName.Equals(ec.DbColumnName)
  33. // && ((!UtilMethods.GetUnderType(ec.PropertyInfo).IsEnum() && UtilMethods.GetUnderType(ec.PropertyInfo).IsIn(UtilConstants.StringType)) ||
  34. // IsSamgeType(ec, dc)))).ToList();
  35. var renameColumns = entityColumns
  36. .Where(it => !string.IsNullOrEmpty(it.OldDbColumnName))
  37. .Where(entityColumn => dbColumns.Any(dbColumn => entityColumn.OldDbColumnName.Equals(dbColumn.DbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  38. .ToList();
  39. var isChange = false;
  40. foreach (var item in addColumns)
  41. {
  42. this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
  43. isChange = true;
  44. }
  45. foreach (var item in dropColumns)
  46. {
  47. //only support .net core
  48. if (this.Context.CurrentConnectionConfig?.MoreSettings?.SqliteCodeFirstEnableDropColumn == true)
  49. {
  50. this.Context.DbMaintenance.DropColumn(tableName, item.DbColumnName);
  51. isChange = true;
  52. }
  53. }
  54. //foreach (var item in alterColumns)
  55. //{
  56. // //this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
  57. // //isChange = true;
  58. //}
  59. foreach (var item in renameColumns)
  60. {
  61. throw new NotSupportedException("rename Column");
  62. }
  63. foreach (var item in entityColumns)
  64. {
  65. var dbColumn = dbColumns.FirstOrDefault(dc => dc.DbColumnName.Equals(item.DbColumnName, StringComparison.CurrentCultureIgnoreCase));
  66. if (dbColumn == null) continue;
  67. bool pkDiff, idEntityDiff;
  68. KeyAction(item, dbColumn, out pkDiff, out idEntityDiff);
  69. if (dbColumn != null && pkDiff && !idEntityDiff)
  70. {
  71. var isAdd = item.IsPrimarykey;
  72. if (isAdd)
  73. {
  74. this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
  75. }
  76. else
  77. {
  78. this.Context.DbMaintenance.DropConstraint(tableName, string.Format("PK_{0}_{1}", tableName, item.DbColumnName));
  79. }
  80. }
  81. else if (pkDiff || idEntityDiff)
  82. {
  83. ChangeKey(entityInfo, tableName, item);
  84. }
  85. }
  86. if (isChange && base.IsBackupTable)
  87. {
  88. this.Context.DbMaintenance.BackupTable(tableName, tableName + DateTime.Now.ToString("yyyyMMddHHmmss"), MaxBackupDataRows);
  89. }
  90. }
  91. }
  92. private void AddColumn(EntityInfo entityInfo)
  93. {
  94. var tableName2 = GetTableName(entityInfo);
  95. var dbColumns2 = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName2, false);
  96. var entityColumns2 = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList();
  97. ConvertColumns(dbColumns2);
  98. var addColumns2 = entityColumns2
  99. .Where(ec => ec.OldDbColumnName.IsNullOrEmpty() || !dbColumns2.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
  100. .Where(ec => !dbColumns2.Any(dc => ec.DbColumnName.Equals(dc.DbColumnName, StringComparison.CurrentCultureIgnoreCase))).ToList();
  101. foreach (var item in addColumns2)
  102. {
  103. if (item.IsPrimarykey || item.IsIdentity)
  104. {
  105. Check.ExceptionEasy("Multiple primary keys cannot be modified", "多主键不能修改");
  106. }
  107. this.Context.DbMaintenance.AddColumn(tableName2, EntityColumnToDbColumn(entityInfo, tableName2, item));
  108. }
  109. }
  110. public override void NoExistLogic(EntityInfo entityInfo)
  111. {
  112. var tableName = GetTableName(entityInfo);
  113. string backupName=tableName+DateTime.Now.ToString("yyyyMMddHHmmss");
  114. //Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1");
  115. List<DbColumnInfo> columns = new List<DbColumnInfo>();
  116. if (entityInfo.Columns.HasValue())
  117. {
  118. foreach (var item in entityInfo.Columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).Where(it=>it.IsIgnore==false))
  119. {
  120. DbColumnInfo dbColumnInfo = this.EntityColumnToDbColumn(entityInfo, tableName, item);
  121. columns.Add(dbColumnInfo);
  122. }
  123. if (entityInfo.IsCreateTableFiledSort)
  124. {
  125. columns = columns.OrderBy(c => c.CreateTableFieldSort).ToList();
  126. columns = columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).ToList();
  127. }
  128. }
  129. this.Context.DbMaintenance.CreateTable(tableName, columns,true);
  130. }
  131. protected override DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
  132. {
  133. var propertyType = UtilMethods.GetUnderType(item.PropertyInfo);
  134. var result = new DbColumnInfo()
  135. {
  136. TableId = entityInfo.Columns.IndexOf(item),
  137. DbColumnName = item.DbColumnName.HasValue() ? item.DbColumnName : item.PropertyName,
  138. IsPrimarykey = item.IsPrimarykey,
  139. IsIdentity = item.IsIdentity,
  140. TableName = tableName,
  141. IsNullable = item.IsNullable,
  142. DefaultValue = item.DefaultValue,
  143. ColumnDescription = item.ColumnDescription,
  144. Length = item.Length,
  145. CreateTableFieldSort = item.CreateTableFieldSort
  146. };
  147. GetDbType(item, propertyType, result);
  148. if (result.DataType.Equals("varchar", StringComparison.CurrentCultureIgnoreCase) && result.Length == 0)
  149. {
  150. result.Length = 1;
  151. }
  152. return result;
  153. }
  154. protected override void ConvertColumns(List<DbColumnInfo> dbColumns)
  155. {
  156. foreach (var item in dbColumns)
  157. {
  158. if (item.DataType == "DateTime")
  159. {
  160. item.Length = 0;
  161. }
  162. }
  163. }
  164. protected override void ChangeKey(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
  165. {
  166. this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
  167. if (!item.IsPrimarykey)
  168. this.Context.DbMaintenance.DropConstraint(tableName,null);
  169. if (item.IsPrimarykey)
  170. this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
  171. }
  172. }
  173. }