DmCodeFirst.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace SqlSugar
  6. {
  7. public class DmCodeFirst : 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.Where(it=>it.IsIgnore==false))
  17. {
  18. DbColumnInfo dbColumnInfo = this.EntityColumnToDbColumn(entityInfo, tableName, item);
  19. columns.Add(dbColumnInfo);
  20. }
  21. if (entityInfo.IsCreateTableFiledSort)
  22. {
  23. columns = columns.OrderBy(c => c.CreateTableFieldSort).ToList();
  24. columns = columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).ToList();
  25. }
  26. }
  27. columns = columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).ToList();
  28. this.Context.DbMaintenance.CreateTable(tableName, columns,true);
  29. }
  30. protected override DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
  31. {
  32. var propertyType = UtilMethods.GetUnderType(item.PropertyInfo);
  33. var result = new DbColumnInfo()
  34. {
  35. TableId = entityInfo.Columns.IndexOf(item),
  36. DbColumnName = item.DbColumnName.HasValue() ? item.DbColumnName : item.PropertyName,
  37. IsPrimarykey = item.IsPrimarykey,
  38. IsIdentity = item.IsIdentity,
  39. TableName = tableName,
  40. IsNullable = item.IsNullable,
  41. DefaultValue = item.DefaultValue,
  42. ColumnDescription = item.ColumnDescription,
  43. Length = item.Length,
  44. DecimalDigits= item.DecimalDigits,
  45. Scale=item.DecimalDigits,
  46. CreateTableFieldSort = item.CreateTableFieldSort
  47. };
  48. GetDbType(item, propertyType, result);
  49. if (result.DataType.Equals("varchar", StringComparison.CurrentCultureIgnoreCase) && result.Length == 0)
  50. {
  51. result.Length = 1;
  52. }
  53. return result;
  54. }
  55. protected override void GetDbType(EntityColumnInfo item, Type propertyType, DbColumnInfo result)
  56. {
  57. if (!string.IsNullOrEmpty(item.DataType))
  58. {
  59. result.DataType = item.DataType;
  60. }
  61. else if (item.DataType == null && item.UnderType == UtilConstants.LongType)
  62. {
  63. result.Length = 0;
  64. result.DecimalDigits = 0;
  65. result.DataType = "NUMBER(19,0)";
  66. }
  67. else if (propertyType.IsEnum())
  68. {
  69. result.DataType = this.Context.Ado.DbBind.GetDbTypeName(item.Length > 9 ? UtilConstants.LongType.Name : UtilConstants.IntType.Name);
  70. }
  71. else
  72. {
  73. if (propertyType.Name.Equals("Guid", StringComparison.CurrentCultureIgnoreCase))
  74. {
  75. result.DataType = this.Context.Ado.DbBind.GetDbTypeName(UtilConstants.StringType.Name);
  76. if (result.Length <= 1)
  77. {
  78. result.Length = 36;
  79. }
  80. }
  81. else
  82. {
  83. result.DataType = this.Context.Ado.DbBind.GetDbTypeName(propertyType.Name);
  84. }
  85. }
  86. }
  87. protected override void ConvertColumns(List<DbColumnInfo> dbColumns)
  88. {
  89. foreach (var item in dbColumns)
  90. {
  91. if (item.DataType == "DateTime")
  92. {
  93. item.Length = 0;
  94. }
  95. }
  96. }
  97. protected override void ChangeKey(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
  98. {
  99. this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
  100. if (!item.IsPrimarykey)
  101. this.Context.DbMaintenance.DropConstraint(tableName,null);
  102. if (item.IsPrimarykey)
  103. this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
  104. }
  105. }
  106. }