MySqlCodeFirst.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace SqlSugar
  6. {
  7. public class MySqlCodeFirst : CodeFirstProvider
  8. {
  9. public override void NoExistLogic(EntityInfo entityInfo)
  10. {
  11. var tableName = GetTableName(entityInfo);
  12. //Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1");
  13. List<DbColumnInfo> columns = new List<DbColumnInfo>();
  14. if (entityInfo.Columns.HasValue())
  15. {
  16. foreach (var item in entityInfo.Columns.OrderBy(it => it.IsPrimarykey ? 0 : 1))
  17. {
  18. if (item.IsIgnore)
  19. continue;
  20. if (item.PropertyInfo!=null&&UtilMethods.GetUnderType(item.PropertyInfo.PropertyType) == UtilConstants.GuidType && item.Length == 0&&item.DataType==null)
  21. {
  22. item.Length = Guid.NewGuid().ToString().Length;
  23. }
  24. DbColumnInfo dbColumnInfo = this.EntityColumnToDbColumn(entityInfo, tableName, item);
  25. columns.Add(dbColumnInfo);
  26. }
  27. if (entityInfo.IsCreateTableFiledSort)
  28. {
  29. columns = columns.OrderBy(c => c.CreateTableFieldSort).ToList();
  30. columns = columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).ToList();
  31. }
  32. }
  33. this.Context.DbMaintenance.CreateTable(tableName, columns,true);
  34. }
  35. protected override DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
  36. {
  37. var propertyType = UtilMethods.GetUnderType(item.PropertyInfo);
  38. var result = new DbColumnInfo()
  39. {
  40. TableId = entityInfo.Columns.IndexOf(item),
  41. DbColumnName = item.DbColumnName.HasValue() ? item.DbColumnName : item.PropertyName,
  42. IsPrimarykey = item.IsPrimarykey,
  43. IsIdentity = item.IsIdentity,
  44. TableName = tableName,
  45. IsNullable = item.IsNullable,
  46. DefaultValue = item.DefaultValue,
  47. ColumnDescription = item.ColumnDescription,
  48. Length = item.Length,
  49. DecimalDigits=item.DecimalDigits,
  50. CreateTableFieldSort = item.CreateTableFieldSort
  51. };
  52. GetDbType(item, propertyType, result);
  53. if (result.DataType.Equals("varchar", StringComparison.CurrentCultureIgnoreCase) && result.Length == 0)
  54. {
  55. result.Length = 1;
  56. }
  57. return result;
  58. }
  59. protected override void ConvertColumns(List<DbColumnInfo> dbColumns)
  60. {
  61. foreach (var item in dbColumns)
  62. {
  63. if (item.DataType == "DateTime")
  64. {
  65. item.Length = 0;
  66. }
  67. }
  68. }
  69. protected override void ChangeKey(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
  70. {
  71. this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
  72. if (!item.IsPrimarykey)
  73. this.Context.DbMaintenance.DropConstraint(tableName,null);
  74. if (item.IsPrimarykey)
  75. this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
  76. }
  77. internal DbColumnInfo GetEntityColumnToDbColumn(EntityInfo entity, string dbTableName, EntityColumnInfo item)
  78. {
  79. return EntityColumnToDbColumn(entity,dbTableName,item);
  80. }
  81. protected override void GetDbType(EntityColumnInfo item, Type propertyType, DbColumnInfo result)
  82. {
  83. if (!string.IsNullOrEmpty(item.DataType))
  84. {
  85. result.DataType = item.DataType;
  86. }
  87. else if (propertyType.IsEnum())
  88. {
  89. result.DataType = this.Context.Ado.DbBind.GetDbTypeName(item.Length > 9 ? UtilConstants.LongType.Name : UtilConstants.IntType.Name);
  90. }
  91. else if (item.IsJson && item.DataType == null)
  92. {
  93. result.DataType = "json";
  94. }
  95. else if (propertyType == UtilConstants.DecType&&item.Length==0&&item.DecimalDigits==0)
  96. {
  97. result.Length = 18;
  98. result.DecimalDigits = 4;
  99. result.DataType = "decimal";
  100. }
  101. else
  102. {
  103. var name = GetType(propertyType.Name);
  104. if (name == "Boolean")
  105. {
  106. result.DataType = "tinyint";
  107. result.Length = 1;
  108. result.Scale = 0;
  109. result.DecimalDigits = 0;
  110. }
  111. else
  112. {
  113. result.DataType = this.Context.Ado.DbBind.GetDbTypeName(name);
  114. if (name == "Guid" && result.DataType == "varchar"&&result.Length<=1)
  115. {
  116. result.Length = 36;
  117. }
  118. }
  119. }
  120. }
  121. protected override bool IsNoSamgeType(EntityColumnInfo ec, DbColumnInfo dc)
  122. {
  123. if (ec.UnderType==UtilConstants.BoolType && dc.DataType == "tinyint" && dc.Length == 1)
  124. {
  125. return false;
  126. }
  127. else if (ec.UnderType == UtilConstants.DobType && dc.DataType== "double")
  128. {
  129. return false;
  130. }
  131. else if (ec.UnderType == UtilConstants.DateType && dc.DataType?.StartsWith("datetime")==true)
  132. {
  133. return false;
  134. }
  135. return base.IsNoSamgeType(ec, dc);
  136. }
  137. }
  138. }