mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2026-02-26 05:32:53 +08:00
Code First
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -121,6 +121,7 @@ namespace SqlSugar
|
||||
column.ColumnDescription = sugarColumn.ColumnDescription;
|
||||
column.IsNullable = sugarColumn.IsNullable;
|
||||
column.Length = sugarColumn.Length;
|
||||
column.OldDbColumnName = sugarColumn.OldColumnName;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -72,6 +72,14 @@ namespace SqlSugar
|
||||
get { return _IsNullable; }
|
||||
set { _IsNullable = value; }
|
||||
}
|
||||
|
||||
private string _OldColumnName;
|
||||
public string OldColumnName
|
||||
{
|
||||
get { return _OldColumnName; }
|
||||
set { _OldColumnName = value; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,13 +13,13 @@ namespace SqlSugar
|
||||
return new List<KeyValuePair<string, CSharpDataType>>()
|
||||
{
|
||||
new KeyValuePair<string, CSharpDataType>("int",CSharpDataType.@int),
|
||||
new KeyValuePair<string, CSharpDataType>("varchar",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("nvarchar",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("sql_variant",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("text",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("char",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("ntext",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("nchar",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("varchar",CSharpDataType.@string),
|
||||
new KeyValuePair<string, CSharpDataType>("bigint",CSharpDataType.@long),
|
||||
new KeyValuePair<string, CSharpDataType>("bit",CSharpDataType.@bool),
|
||||
new KeyValuePair<string, CSharpDataType>("datetime",CSharpDataType.DateTime),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user