Update Sqlite CodeFirst

This commit is contained in:
sunkaixuan 2019-01-20 19:54:32 +08:00
parent d8d5176428
commit 929def762c
5 changed files with 81 additions and 15 deletions

View File

@ -9,8 +9,8 @@ namespace SqlSugar
{
#region Properties
public virtual SqlSugarClient Context { get; set; }
private bool IsBackupTable { get; set; }
private int MaxBackupDataRows { get; set; }
protected bool IsBackupTable { get; set; }
protected int MaxBackupDataRows { get; set; }
protected virtual int DefultLength { get; set; }
#endregion

View File

@ -9,21 +9,83 @@ namespace SqlSugar
{
public override void ExistLogic(EntityInfo entityInfo)
{
var tableName = GetTableName(entityInfo);
string backupName = tableName + DateTime.Now.ToString("yyyyMMddHHmmss");
Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1");
List<DbColumnInfo> columns = new List<DbColumnInfo>();
if (entityInfo.Columns.HasValue())
{
foreach (var item in entityInfo.Columns.Where(it => it.IsIgnore == false))
Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1");
var tableName = GetTableName(entityInfo);
var dbColumns = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName);
ConvertColumns(dbColumns);
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)
// && ((!UtilMethods.GetUnderType(ec.PropertyInfo).IsEnum() && UtilMethods.GetUnderType(ec.PropertyInfo).IsIn(UtilConstants.StringType)) ||
// IsSamgeType(ec, dc)))).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)
{
DbColumnInfo dbColumnInfo = this.EntityColumnToDbColumn(entityInfo, tableName, item);
columns.Add(dbColumnInfo);
this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
isChange = true;
}
foreach (var item in dropColumns)
{
//this.Context.DbMaintenance.DropColumn(tableName, item.DbColumnName);
//isChange = true;
}
//foreach (var item in alterColumns)
//{
// //this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
// //isChange = true;
//}
foreach (var item in renameColumns)
{
throw new NotSupportedException("rename Column");
}
foreach (var item in entityColumns)
{
var dbColumn = dbColumns.FirstOrDefault(dc => dc.DbColumnName.Equals(item.DbColumnName, StringComparison.CurrentCultureIgnoreCase));
if (dbColumn == null) continue;
bool pkDiff, idEntityDiff;
KeyAction(item, dbColumn, out pkDiff, out idEntityDiff);
if (dbColumn != null && pkDiff && !idEntityDiff)
{
var isAdd = item.IsPrimarykey;
if (isAdd)
{
this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
}
else
{
this.Context.DbMaintenance.DropConstraint(tableName, string.Format("PK_{0}_{1}", tableName, item.DbColumnName));
}
}
else if (pkDiff || idEntityDiff)
{
ChangeKey(entityInfo, tableName, item);
}
}
if (isChange && base.IsBackupTable)
{
this.Context.DbMaintenance.BackupTable(tableName, tableName + DateTime.Now.ToString("yyyyMMddHHmmss"), MaxBackupDataRows);
}
}
this.Context.DbMaintenance.BackupTable(tableName, backupName, int.MaxValue);
this.Context.DbMaintenance.DropTable(tableName);
this.Context.DbMaintenance.CreateTable(tableName,columns);
}
public override void NoExistLogic(EntityInfo entityInfo)
{

View File

@ -46,7 +46,7 @@ namespace SqlSugar
{
get
{
throw new NotSupportedException();
return "ALTER TABLE {0} ADD COLUMN {1} {2}{3}";
}
}
protected override string AlterColumnToTableSql
@ -212,6 +212,7 @@ namespace SqlSugar
#endregion
#region Methods
public override List<DbColumnInfo> GetColumnInfosByTableName(string tableName, bool isCache = true)
{
string cacheKey = "DbMaintenanceProvider.GetColumnInfosByTableName." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower();

View File

@ -22,13 +22,16 @@ namespace OrmTest.Demo
[SugarColumn(IsNullable = true,OldColumnName = "Dob")]
public double? Dob2 { get; set; }
[SugarColumn(Length =10)]
public string A { get; set; }
public string A1 { get; set; }
}
public class CodeTable2 {
[SugarColumn(IsPrimaryKey =true,IsIdentity =true)]
public int Id { get; set; }
public string Name { get; set; }
[SugarColumn(IsIgnore =true)]
public string TestId { get; set; }
public string Test { get; set; }
public int Test22222x2 { get; set; }
}
public class CodeFirst : DemoBase
{
@ -46,7 +49,7 @@ namespace OrmTest.Demo
//db.CodeFirst.BackupTable().InitTables(typeof(CodeTable),typeof(CodeTable2));
//No backup table
db.CodeFirst.InitTables(typeof(CodeTable),typeof(CodeTable2));
db.CodeFirst.BackupTable().InitTables(typeof(CodeTable),typeof(CodeTable2));
}
}
}