Code First

This commit is contained in:
sunkaixuan
2017-06-18 04:15:09 +08:00
parent 32e0b6f7cc
commit 822fd601ca
10 changed files with 67 additions and 29 deletions

View File

@@ -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));
}
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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

View File

@@ -121,6 +121,7 @@ namespace SqlSugar
column.ColumnDescription = sugarColumn.ColumnDescription;
column.IsNullable = sugarColumn.IsNullable;
column.Length = sugarColumn.Length;
column.OldDbColumnName = sugarColumn.OldColumnName;
}
else
{

View File

@@ -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; }

View File

@@ -72,6 +72,14 @@ namespace SqlSugar
get { return _IsNullable; }
set { _IsNullable = value; }
}
private string _OldColumnName;
public string OldColumnName
{
get { return _OldColumnName; }
set { _OldColumnName = value; }
}
}
}

View File

@@ -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
}
}

View File

@@ -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),

View File

@@ -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