Code First

This commit is contained in:
sunkaixuan 2017-06-18 01:44:00 +08:00
parent d12c8fed02
commit 32e0b6f7cc
3 changed files with 41 additions and 16 deletions

View File

@ -8,9 +8,8 @@ namespace OrmTest.Demo
{
public class CodeTable
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
[SugarColumn(Length = 100)]
[SugarColumn(Length = 2)]
public string Name { get; set; }
[SugarColumn(IsNullable = true)]
public bool IsOk { get; set; }
@ -22,6 +21,10 @@ namespace OrmTest.Demo
public double? Dob { get; set; }
public string A { get; set; }
}
public class CodeTable2 {
public int Id { get; set; }
public string Name { get; set; }
}
public class CodeFirst : DemoBase
{
public static void Init()
@ -31,12 +34,14 @@ namespace OrmTest.Demo
ConnectionString = Config.ConnectionString,
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
InitKeyType = InitKeyType.Attribute
});
//if (db.DbMaintenance.IsAnyTable("CodeTable"))
// db.DbMaintenance.DropTable("CodeTable");
//db.DbMaintenance.BackupDataBase("SqlSugar4XTest","c:\\back\\1.bak");
db.CodeFirst.InitTables(typeof(CodeTable));
//Backup table
db.CodeFirst.BackupTable().InitTables(typeof(CodeTable),typeof(CodeTable2));
//No backup table
//db.CodeFirst.InitTables(typeof(CodeTable),typeof(CodeTable2));
}
}
}

View File

@ -9,11 +9,20 @@ namespace SqlSugar
{
#region Properties
public virtual SqlSugarClient Context { get; set; }
private bool IsBackupTable { get; set; }
private int MaxBackupDataRows { get; set; }
#endregion
#region Public methods
public ICodeFirst BackupTable(int maxBackupDataRows = int.MaxValue)
{
this.IsBackupTable = true;
this.MaxBackupDataRows = maxBackupDataRows;
return this;
}
public void InitTables(Type entityType)
{
Check.Exception(this.Context.IsSystemTablesConfig, "Please set SqlSugarClent Parameter ConnectionConfig.InitKeyType=InitKeyType.Attribute ");
var executeResult = Context.Ado.UseTran(() =>
{
Execute(entityType);
@ -35,7 +44,7 @@ namespace SqlSugar
var types = Assembly.Load(entitiesNamespace).GetTypes();
InitTables(types);
}
public void InitTables(string[] entitiesNamespaces)
public void InitTables(params string[] entitiesNamespaces)
{
if (entitiesNamespaces.IsValuable())
{
@ -79,26 +88,36 @@ namespace SqlSugar
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 addColumns = entityInfo.Columns.Where(entityColumn => !dbColumns.Any(dbColumn => entityColumn.DbColumnName.Equals(dbColumn.DbColumnName))).ToList();
var alterColumns = dbColumns.Where(dbColumn => entityInfo.Columns
.Any(entityCoulmn =>
.Any(entityCoulmn =>
dbColumn.DbColumnName.Equals(entityCoulmn.DbColumnName)
&&((entityCoulmn.Length!=dbColumn.Length&&PubMethod.GetUnderType(entityCoulmn.PropertyInfo).IsIn(PubConst.StringType))||entityCoulmn.IsNullable!=dbColumn.IsNullable)
&& ((entityCoulmn.Length != dbColumn.Length && PubMethod.GetUnderType(entityCoulmn.PropertyInfo).IsIn(PubConst.StringType)) || entityCoulmn.IsNullable != dbColumn.IsNullable)
)).ToList();
var isChange = false;
foreach (var item in addColumns)
{
this.Context.DbMaintenance.AddColumn(tableName,EntityColumnToDbColumn(entityInfo,tableName,item));
this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
isChange = true;
}
foreach (var item in droupColumns)
{
this.Context.DbMaintenance.DropColumn(tableName,item.DbColumnName);
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);
isChange = true;
}
if (isChange && IsBackupTable)
{
this.Context.DbMaintenance.BackupTable(tableName, tableName + DateTime.Now.ToString("yyyyMMddHHmmss"),MaxBackupDataRows);
}
}
}
@ -124,9 +143,8 @@ namespace SqlSugar
}
private DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
{
return new DbColumnInfo()
var result= new DbColumnInfo()
{
Length = item.Length,
DataType = this.Context.Ado.DbBind.GetDbTypeName(PubMethod.GetUnderType(item.PropertyInfo).Name),
TableId = entityInfo.Columns.IndexOf(item),
DbColumnName = item.DbColumnName.IsValuable() ? item.DbColumnName : item.PropertyName,
@ -137,6 +155,7 @@ namespace SqlSugar
DefaultValue = item.DefaultValue,
ColumnDescription = item.ColumnDescription
};
return result;
}
#endregion
}

View File

@ -7,9 +7,10 @@ namespace SqlSugar
public partial interface ICodeFirst
{
SqlSugarClient Context { get; set; }
ICodeFirst BackupTable(int maxBackupDataRows=int.MaxValue);
void InitTables(string entitiesNamespace);
void InitTables(string [] entitiesNamespaces);
void InitTables(Type [] entityTypes);
void InitTables(params Type [] entityTypes);
void InitTables(Type entityType);
}
}