using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SqlSugar { public class DmCodeFirst : CodeFirstProvider { public override void NoExistLogic(EntityInfo entityInfo) { var tableName = GetTableName(entityInfo); //Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1"); List columns = new List(); if (entityInfo.Columns.HasValue()) { foreach (var item in entityInfo.Columns.Where(it=>it.IsIgnore==false)) { DbColumnInfo dbColumnInfo = this.EntityColumnToDbColumn(entityInfo, tableName, item); columns.Add(dbColumnInfo); } if (entityInfo.IsCreateTableFiledSort) { columns = columns.OrderBy(c => c.CreateTableFieldSort).ToList(); columns = columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).ToList(); } } columns = columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).ToList(); this.Context.DbMaintenance.CreateTable(tableName, columns,true); } protected override DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item) { var propertyType = UtilMethods.GetUnderType(item.PropertyInfo); var result = new DbColumnInfo() { TableId = entityInfo.Columns.IndexOf(item), DbColumnName = item.DbColumnName.HasValue() ? item.DbColumnName : item.PropertyName, IsPrimarykey = item.IsPrimarykey, IsIdentity = item.IsIdentity, TableName = tableName, IsNullable = item.IsNullable, DefaultValue = item.DefaultValue, ColumnDescription = item.ColumnDescription, Length = item.Length, DecimalDigits= item.DecimalDigits, Scale=item.DecimalDigits, CreateTableFieldSort = item.CreateTableFieldSort }; GetDbType(item, propertyType, result); if (result.DataType.Equals("varchar", StringComparison.CurrentCultureIgnoreCase) && result.Length == 0) { result.Length = 1; } return result; } protected override void GetDbType(EntityColumnInfo item, Type propertyType, DbColumnInfo result) { if (!string.IsNullOrEmpty(item.DataType)) { result.DataType = item.DataType; } else if (item.DataType == null && item.UnderType == UtilConstants.LongType) { result.Length = 0; result.DecimalDigits = 0; result.DataType = "NUMBER(19,0)"; } else if (propertyType.IsEnum()) { result.DataType = this.Context.Ado.DbBind.GetDbTypeName(item.Length > 9 ? UtilConstants.LongType.Name : UtilConstants.IntType.Name); } else { if (propertyType.Name.Equals("Guid", StringComparison.CurrentCultureIgnoreCase)) { result.DataType = this.Context.Ado.DbBind.GetDbTypeName(UtilConstants.StringType.Name); if (result.Length <= 1) { result.Length = 36; } } else { result.DataType = this.Context.Ado.DbBind.GetDbTypeName(propertyType.Name); } } } protected override void ConvertColumns(List dbColumns) { foreach (var item in dbColumns) { if (item.DataType == "DateTime") { item.Length = 0; } } } protected override void ChangeKey(EntityInfo entityInfo, string tableName, EntityColumnInfo item) { this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item)); if (!item.IsPrimarykey) this.Context.DbMaintenance.DropConstraint(tableName,null); if (item.IsPrimarykey) this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName); } } }