diff --git a/SqlServerTest/Demos/5_CodeFirst.cs b/SqlServerTest/Demos/5_CodeFirst.cs index a1ee938e2..392e62da2 100644 --- a/SqlServerTest/Demos/5_CodeFirst.cs +++ b/SqlServerTest/Demos/5_CodeFirst.cs @@ -9,7 +9,7 @@ namespace OrmTest.Demo public class CodeTable { public int Id { get; set; } - [SugarColumn(Length = 2)] + [SugarColumn(Length = 21)] public string Name { get; set; } [SugarColumn(IsNullable = true)] public bool IsOk { get; set; } @@ -17,13 +17,16 @@ namespace OrmTest.Demo public decimal Decimal { get; set; } [SugarColumn(IsNullable = true)] public DateTime? DateTime { get; set; } - [SugarColumn(IsNullable = true)] - public double? Dob { get; set; } + [SugarColumn(IsNullable = true,OldColumnName = "Dob")] + public double? Dob2 { get; set; } + [SugarColumn(Length =10)] public string A { get; set; } } public class CodeTable2 { public int Id { get; set; } public string Name { get; set; } + [SugarColumn(IsIgnore =true)] + public string TestId { get; set; } } public class CodeFirst : DemoBase { @@ -38,10 +41,10 @@ namespace OrmTest.Demo }); //Backup table - db.CodeFirst.BackupTable().InitTables(typeof(CodeTable),typeof(CodeTable2)); + //db.CodeFirst.BackupTable().InitTables(typeof(CodeTable),typeof(CodeTable2)); //No backup table - //db.CodeFirst.InitTables(typeof(CodeTable),typeof(CodeTable2)); + db.CodeFirst.InitTables(typeof(CodeTable),typeof(CodeTable2)); } } } diff --git a/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs b/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs index 6ca0fb592..de7a5a5f7 100644 --- a/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs +++ b/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs @@ -59,7 +59,7 @@ namespace SqlSugar #region Core Logic private void Execute(Type entityType) { - var entityInfo = this.Context.EntityProvider.GetEntityInfo(entityType); + var entityInfo =this.Context.EntityProvider.GetEntityInfo(entityType); var tableName = GetTableName(entityInfo); var isAny = this.Context.DbMaintenance.IsAnyTable(tableName); if (isAny) @@ -86,33 +86,44 @@ namespace SqlSugar if (entityInfo.Columns.IsValuable()) { var tableName = GetTableName(entityInfo); - var dbColumns = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName); - var droupColumns = dbColumns.Where(dbColumn => !entityInfo.Columns.Any(entityCoulmn => dbColumn.DbColumnName.Equals(entityCoulmn.DbColumnName))).ToList(); - var addColumns = entityInfo.Columns.Where(entityColumn => !dbColumns.Any(dbColumn => entityColumn.DbColumnName.Equals(dbColumn.DbColumnName))).ToList(); - var alterColumns = dbColumns.Where(dbColumn => entityInfo.Columns - .Any(entityCoulmn => - dbColumn.DbColumnName.Equals(entityCoulmn.DbColumnName) - && ((entityCoulmn.Length != dbColumn.Length && PubMethod.GetUnderType(entityCoulmn.PropertyInfo).IsIn(PubConst.StringType)) || entityCoulmn.IsNullable != dbColumn.IsNullable) - )).ToList(); + var dbColumns =this.Context.DbMaintenance.GetColumnInfosByTableName(tableName); + var entityColumns = entityInfo.Columns.Where(it=>it.IsIgnore==false).ToList(); + var dropColumns = dbColumns + .Where(dc =>!entityColumns.Any(ec =>dc.DbColumnName.Equals(ec.OldDbColumnName,StringComparison.CurrentCultureIgnoreCase))) + .Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.DbColumnName, StringComparison.CurrentCultureIgnoreCase))) + .ToList(); + var addColumns = entityColumns + .Where(ec=>ec.OldDbColumnName.IsNullOrEmpty()||!dbColumns.Any(dc=>dc.DbColumnName.Equals(ec.OldDbColumnName,StringComparison.CurrentCultureIgnoreCase))) + .Where(ec => !dbColumns.Any(dc => ec.DbColumnName.Equals(dc.DbColumnName,StringComparison.CurrentCultureIgnoreCase))).ToList(); + var alterColumns = entityColumns + .Where(ec => !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName,StringComparison.CurrentCultureIgnoreCase))) + .Where(ec => + dbColumns.Any(dc =>dc.DbColumnName.Equals(ec.DbColumnName) + && ((ec.Length != dc.Length && PubMethod.GetUnderType(ec.PropertyInfo).IsIn(PubConst.StringType)) || ec.IsNullable != dc.IsNullable))).ToList(); + var renameColumns = entityColumns + .Where(it => !string.IsNullOrEmpty(it.OldDbColumnName)) + .Where(entityColumn =>dbColumns.Any(dbColumn => entityColumn.OldDbColumnName.Equals(dbColumn.DbColumnName,StringComparison.CurrentCultureIgnoreCase))) + .ToList(); + var isChange = false; foreach (var item in addColumns) { this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item)); isChange = true; } - foreach (var item in droupColumns) + foreach (var item in dropColumns) { this.Context.DbMaintenance.DropColumn(tableName, item.DbColumnName); isChange = true; } foreach (var item in alterColumns) { - var newitem = this.Context.RewritableMethods.TranslateCopy(item); - newitem.IsPrimarykey = false; - newitem.IsIdentity = false; - if (newitem.Length > 0) - newitem.Length = newitem.Length / 2; - this.Context.DbMaintenance.UpdateColumn(tableName, newitem); + this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo,tableName,item)); + isChange = true; + } + foreach (var item in renameColumns) + { + this.Context.DbMaintenance.RenameColumn(tableName,item.OldDbColumnName,item.DbColumnName); isChange = true; } if (isChange && IsBackupTable) @@ -134,7 +145,6 @@ namespace SqlSugar { StringBuilder result = new StringBuilder(); var tableName = GetTableName(entityInfo); - return result.ToString(); } private static string GetTableName(EntityInfo entityInfo) @@ -153,7 +163,8 @@ namespace SqlSugar TableName = tableName, IsNullable = item.IsNullable, DefaultValue = item.DefaultValue, - ColumnDescription = item.ColumnDescription + ColumnDescription = item.ColumnDescription, + Length=item.Length }; return result; } diff --git a/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs b/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs index d54cdcc9e..ea2d52abd 100644 --- a/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs +++ b/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs @@ -92,8 +92,9 @@ namespace SqlSugar this.Context.Ado.ExecuteCommand(sql); return true; } - public virtual bool UpdateColumn(string tableName, DbColumnInfo column) { - string sql = GetUpdateColumnSql(tableName,column); + public virtual bool UpdateColumn(string tableName, DbColumnInfo column) + { + string sql = GetUpdateColumnSql(tableName, column); this.Context.Ado.ExecuteCommand(sql); return true; } @@ -134,12 +135,18 @@ namespace SqlSugar this.Context.Ado.ExecuteCommand(string.Format(this.BackupDataBaseSql, databaseName, fullFileName)); return true; } - public virtual bool BackupTable(string oldTableName, string newTableName,int maxBackupDataRows=int.MaxValue) + public virtual bool BackupTable(string oldTableName, string newTableName, int maxBackupDataRows = int.MaxValue) { string sql = string.Format(this.BackupTableSql, maxBackupDataRows, newTableName, oldTableName); this.Context.Ado.ExecuteCommand(sql); return true; } + public virtual bool RenameColumn(string tableName, string oldColumnName, string newColumnName) + { + string sql = string.Format(this.RenameColumnSql, tableName, oldColumnName, newColumnName); + this.Context.Ado.ExecuteCommand(sql); + return true; + } #endregion #region Private @@ -194,8 +201,8 @@ namespace SqlSugar string dataType = columnInfo.DataType; string dataSize = columnInfo.Length > 0 ? string.Format("({0})", columnInfo.Length) : null; string nullType = columnInfo.IsNullable ? this.CreateTableNull : CreateTableNotNull; - string primaryKey = columnInfo.IsPrimarykey ? this.CreateTablePirmaryKey : null; - string identity = columnInfo.IsIdentity ? this.CreateTableIdentity : null; + string primaryKey = null; + string identity = null; string result = string.Format(this.AlterColumnToTableSql, tableName, columnName, dataType, dataSize, nullType, primaryKey, identity); return result; } diff --git a/SqlSugar/Abstract/DbMaintenanceProvider/Properties.cs b/SqlSugar/Abstract/DbMaintenanceProvider/Properties.cs index cadef8f03..0ae807904 100644 --- a/SqlSugar/Abstract/DbMaintenanceProvider/Properties.cs +++ b/SqlSugar/Abstract/DbMaintenanceProvider/Properties.cs @@ -29,6 +29,7 @@ namespace SqlSugar protected abstract string DropColumnToTableSql { get; } protected abstract string DropConstraintSql { get; } protected abstract string AddPrimaryKeySql { get; } + protected abstract string RenameColumnSql { get; } #endregion #region Scattered diff --git a/SqlSugar/Abstract/EntityProvider/EntityProvider.cs b/SqlSugar/Abstract/EntityProvider/EntityProvider.cs index 8dbdbf22e..0a7f3ec44 100644 --- a/SqlSugar/Abstract/EntityProvider/EntityProvider.cs +++ b/SqlSugar/Abstract/EntityProvider/EntityProvider.cs @@ -121,6 +121,7 @@ namespace SqlSugar column.ColumnDescription = sugarColumn.ColumnDescription; column.IsNullable = sugarColumn.IsNullable; column.Length = sugarColumn.Length; + column.OldDbColumnName = sugarColumn.OldColumnName; } else { diff --git a/SqlSugar/Entities/EntityColumnInfo.cs b/SqlSugar/Entities/EntityColumnInfo.cs index 5a29215d9..722814848 100644 --- a/SqlSugar/Entities/EntityColumnInfo.cs +++ b/SqlSugar/Entities/EntityColumnInfo.cs @@ -12,6 +12,7 @@ namespace SqlSugar public PropertyInfo PropertyInfo { get; set; } public string PropertyName { get; set; } public string DbColumnName { get; set; } + public string OldDbColumnName { get; set; } public int Length { get; set; } public string ColumnDescription { get; set; } public string DefaultValue { get; set; } diff --git a/SqlSugar/Entities/Mapping/SugarMappingAttribute.cs b/SqlSugar/Entities/Mapping/SugarMappingAttribute.cs index ca94bb815..74a84f9b3 100644 --- a/SqlSugar/Entities/Mapping/SugarMappingAttribute.cs +++ b/SqlSugar/Entities/Mapping/SugarMappingAttribute.cs @@ -72,6 +72,14 @@ namespace SqlSugar get { return _IsNullable; } set { _IsNullable = value; } } + + private string _OldColumnName; + public string OldColumnName + { + get { return _OldColumnName; } + set { _OldColumnName = value; } + } + } } diff --git a/SqlSugar/Interface/IDbMaintenance.cs b/SqlSugar/Interface/IDbMaintenance.cs index 1229ef78a..dd1cbeb17 100644 --- a/SqlSugar/Interface/IDbMaintenance.cs +++ b/SqlSugar/Interface/IDbMaintenance.cs @@ -34,6 +34,7 @@ namespace SqlSugar bool BackupDataBase(string databaseName,string fullFileName); bool BackupTable(string oldTableName, string newTableName, int maxBackupDataRows = int.MaxValue); bool DropColumn(string tableName,string columnName); + bool RenameColumn(string tableName, string oldColumnName, string newColumnName); #endregion } } diff --git a/SqlSugar/Realization/SqlServer/DbBind/SqlServerDbBind.cs b/SqlSugar/Realization/SqlServer/DbBind/SqlServerDbBind.cs index 5a7f24c33..e343ae1be 100644 --- a/SqlSugar/Realization/SqlServer/DbBind/SqlServerDbBind.cs +++ b/SqlSugar/Realization/SqlServer/DbBind/SqlServerDbBind.cs @@ -13,13 +13,13 @@ namespace SqlSugar return new List>() { new KeyValuePair("int",CSharpDataType.@int), + new KeyValuePair("varchar",CSharpDataType.@string), new KeyValuePair("nvarchar",CSharpDataType.@string), new KeyValuePair("sql_variant",CSharpDataType.@string), new KeyValuePair("text",CSharpDataType.@string), new KeyValuePair("char",CSharpDataType.@string), new KeyValuePair("ntext",CSharpDataType.@string), new KeyValuePair("nchar",CSharpDataType.@string), - new KeyValuePair("varchar",CSharpDataType.@string), new KeyValuePair("bigint",CSharpDataType.@long), new KeyValuePair("bit",CSharpDataType.@bool), new KeyValuePair("datetime",CSharpDataType.DateTime), diff --git a/SqlSugar/Realization/SqlServer/DbMaintenance/SqlServerDbMaintenance.cs b/SqlSugar/Realization/SqlServer/DbMaintenance/SqlServerDbMaintenance.cs index 386675aa7..af291599e 100644 --- a/SqlSugar/Realization/SqlServer/DbMaintenance/SqlServerDbMaintenance.cs +++ b/SqlSugar/Realization/SqlServer/DbMaintenance/SqlServerDbMaintenance.cs @@ -152,6 +152,11 @@ namespace SqlSugar return "ALTER TABLE {0} DROP CONSTRAINT {1}"; } } + protected override string RenameColumnSql { + get { + return "exec sp_rename '{0}.{1}','{2}','column';"; + } + } #endregion #region Scattered