mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-20 02:29:39 +08:00
Add db.CodeFirst.GetDifferenceTables(types)
This commit is contained in:
@@ -72,9 +72,13 @@ namespace OrmTest
|
|||||||
Db.CodeFirst.InitTables<UnitCodeFirst131>();
|
Db.CodeFirst.InitTables<UnitCodeFirst131>();
|
||||||
Db.Insertable(new UnitCodeFirst131() { Id = 1 }).ExecuteCommand();
|
Db.Insertable(new UnitCodeFirst131() { Id = 1 }).ExecuteCommand();
|
||||||
Db.CodeFirst.InitTables<UNITCODEFIRST131>();
|
Db.CodeFirst.InitTables<UNITCODEFIRST131>();
|
||||||
|
var diffInfo = db.CodeFirst.GetDifferenceTables(typeof(UNITCOdEFIRST131)).ToDiffString();
|
||||||
|
db.CodeFirst.InitTables<UNITCOdEFIRST131>();
|
||||||
|
var diffInfo2 = db.CodeFirst.GetDifferenceTables(typeof(UNITCODEFIRST131)).ToDiffString();
|
||||||
Db.CodeFirst.InitTables<UNITCOdEFIRST131>();
|
Db.CodeFirst.InitTables<UNITCOdEFIRST131>();
|
||||||
Db.CodeFirst.InitTables<UnitTableUserName>();
|
Db.CodeFirst.InitTables<UnitTableUserName>();
|
||||||
db.CodeFirst.InitTables<UnitTablename>();
|
db.CodeFirst.InitTables<UnitTablename>();
|
||||||
|
|
||||||
}
|
}
|
||||||
public class UnitCodeFirst131
|
public class UnitCodeFirst131
|
||||||
{
|
{
|
||||||
|
@@ -118,9 +118,61 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public TableDifferenceProvider GetDifferenceTables<T>()
|
||||||
|
{
|
||||||
|
var type = typeof(T);
|
||||||
|
return GetDifferenceTables(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TableDifferenceProvider GetDifferenceTables(params Type[] types)
|
||||||
|
{
|
||||||
|
TableDifferenceProvider result = new TableDifferenceProvider();
|
||||||
|
foreach (var type in types)
|
||||||
|
{
|
||||||
|
GetDifferenceTables(result, type);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Core Logic
|
#region Core Logic
|
||||||
|
private void GetDifferenceTables(TableDifferenceProvider result, Type type)
|
||||||
|
{
|
||||||
|
var tempTableName = "TempDiff" + DateTime.Now.ToString("yyMMssHHmmssfff");
|
||||||
|
var oldTableName = this.Context.EntityMaintenance.GetEntityInfo(type).DbTableName;
|
||||||
|
var db = new SqlSugarProvider(UtilMethods.CopyConfig(this.Context.CurrentConnectionConfig));
|
||||||
|
UtilMethods.IsNullReturnNew(db.CurrentConnectionConfig.ConfigureExternalServices);
|
||||||
|
db.CurrentConnectionConfig.ConfigureExternalServices.EntityNameService += (x, p) =>
|
||||||
|
{
|
||||||
|
p.IsDisabledUpdateAll = true;//Disabled update
|
||||||
|
};
|
||||||
|
db.MappingTables = new MappingTableList();
|
||||||
|
db.MappingTables.Add(type.Name, tempTableName);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
db.CodeFirst.InitTables(type);
|
||||||
|
var tables = db.DbMaintenance.GetTableInfoList(false);
|
||||||
|
var oldTableInfo = tables.FirstOrDefault(it=>it.Name.EqualCase(oldTableName));
|
||||||
|
var newTableInfo = tables.FirstOrDefault(it => it.Name.EqualCase(oldTableName));
|
||||||
|
var oldTable = db.DbMaintenance.GetColumnInfosByTableName(oldTableName, false);
|
||||||
|
var tempTable = db.DbMaintenance.GetColumnInfosByTableName(tempTableName, false);
|
||||||
|
result.tableInfos.Add(new DiffTableInfo()
|
||||||
|
{
|
||||||
|
OldTableInfo= oldTableInfo,
|
||||||
|
NewTableInfo = newTableInfo,
|
||||||
|
OldColumnInfos = oldTable,
|
||||||
|
NewColumnInfos = tempTable
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
db.DbMaintenance.DropTable(tempTableName);
|
||||||
|
}
|
||||||
|
}
|
||||||
protected virtual void Execute(Type entityType)
|
protected virtual void Execute(Type entityType)
|
||||||
{
|
{
|
||||||
var entityInfo = this.Context.EntityMaintenance.GetEntityInfoNoCache(entityType);
|
var entityInfo = this.Context.EntityMaintenance.GetEntityInfoNoCache(entityType);
|
||||||
|
@@ -0,0 +1,140 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Linq;
|
||||||
|
namespace SqlSugar
|
||||||
|
{
|
||||||
|
public class TableDifferenceProvider
|
||||||
|
{
|
||||||
|
internal List<DiffTableInfo> tableInfos = new List<DiffTableInfo>();
|
||||||
|
public string ToDiffString()
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.AppendLine();
|
||||||
|
var diffTables = this.ToDiffList();
|
||||||
|
if (diffTables.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
sb.AppendLine("No change");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var item in diffTables)
|
||||||
|
{
|
||||||
|
sb.AppendLine($"----Table:{ item.TableName }----");
|
||||||
|
if (item.AddColums.HasValue())
|
||||||
|
{
|
||||||
|
sb.AppendLine($"Add column: ");
|
||||||
|
foreach (var addItem in item.AddColums)
|
||||||
|
{
|
||||||
|
sb.AppendLine($"{addItem.Message} ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item.UpdateColums.HasValue())
|
||||||
|
{
|
||||||
|
sb.AppendLine($"Update column: ");
|
||||||
|
foreach (var addItem in item.UpdateColums)
|
||||||
|
{
|
||||||
|
sb.AppendLine($"{addItem.Message} ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item.DeleteColums.HasValue())
|
||||||
|
{
|
||||||
|
sb.AppendLine($"Delete column: ");
|
||||||
|
foreach (var addItem in item.DeleteColums)
|
||||||
|
{
|
||||||
|
sb.AppendLine($"{addItem.Message} ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.AppendLine();
|
||||||
|
sb.AppendLine();
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<TableDifferenceInfo> ToDiffList()
|
||||||
|
{
|
||||||
|
List<TableDifferenceInfo> result = new List<TableDifferenceInfo>();
|
||||||
|
foreach (var tableInfo in tableInfos)
|
||||||
|
{
|
||||||
|
TableDifferenceInfo addItem = new TableDifferenceInfo();
|
||||||
|
addItem.TableName = tableInfo.OldTableInfo.Name;
|
||||||
|
addItem.AddColums = GetAddColumn(tableInfo);
|
||||||
|
addItem.UpdateColums = GetUpdateColumn(tableInfo);
|
||||||
|
addItem.DeleteColums = GetDeleteColumn(tableInfo);
|
||||||
|
if (addItem.IsDiff)
|
||||||
|
result.Add(addItem);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<DiffColumsInfo> GetDeleteColumn(DiffTableInfo tableInfo)
|
||||||
|
{
|
||||||
|
List<DiffColumsInfo> result = new List<DiffColumsInfo>();
|
||||||
|
var columns = tableInfo.OldColumnInfos.Where(z => !tableInfo.NewColumnInfos.Any(y => y.DbColumnName.EqualCase(z.DbColumnName))).ToList();
|
||||||
|
return columns.Select(it => new DiffColumsInfo() { Message= GetColumnString(it) }).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<DiffColumsInfo> GetUpdateColumn(DiffTableInfo tableInfo)
|
||||||
|
{
|
||||||
|
List<DiffColumsInfo> result = new List<DiffColumsInfo>();
|
||||||
|
result = tableInfo.NewColumnInfos
|
||||||
|
.Where(z => tableInfo.OldColumnInfos.Any(y => y.DbColumnName.EqualCase(z.DbColumnName) && (
|
||||||
|
z.Length != y.Length ||
|
||||||
|
z.ColumnDescription != y.ColumnDescription ||
|
||||||
|
z.DataType != y.DataType ||
|
||||||
|
z.DecimalDigits != y.DecimalDigits
|
||||||
|
))).Select(it => new DiffColumsInfo()
|
||||||
|
{
|
||||||
|
Message=GetColumnString(it)
|
||||||
|
}).ToList();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<DiffColumsInfo> GetAddColumn(DiffTableInfo tableInfo)
|
||||||
|
{
|
||||||
|
List<DiffColumsInfo> result = new List<DiffColumsInfo>();
|
||||||
|
var columns = tableInfo.NewColumnInfos.Where(z => !tableInfo.OldColumnInfos.Any(y => y.DbColumnName.EqualCase(z.DbColumnName))).ToList();
|
||||||
|
return columns.Select(it => new DiffColumsInfo() { Message = GetColumnString(it) }).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetColumnString(DbColumnInfo it)
|
||||||
|
{
|
||||||
|
return $"{it.DbColumnName} {it.DataType} {it.Length} {it.Scale} default:{it.DefaultValue} description:{it.ColumnDescription} pk:{it.IsPrimarykey} nullable:{it.IsNullable} identity:{it.IsIdentity} ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class TableDifferenceInfo
|
||||||
|
{
|
||||||
|
public List<DiffColumsInfo> DeleteColums { get; set; } = new List<DiffColumsInfo>();
|
||||||
|
public List<DiffColumsInfo> UpdateColums { get; set; } = new List<DiffColumsInfo>();
|
||||||
|
public List<DiffColumsInfo> AddColums { get; set; } = new List<DiffColumsInfo>();
|
||||||
|
public List<DiffColumsInfo> UpdateRemark { get; set; } = new List<DiffColumsInfo>();
|
||||||
|
public bool IsDiff
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(DeleteColums.Count>0 ||
|
||||||
|
UpdateColums.Count > 0 ||
|
||||||
|
AddColums.Count > 0 ||
|
||||||
|
UpdateRemark.Count > 0) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string TableName { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DiffColumsInfo
|
||||||
|
{
|
||||||
|
public string SqlTemplate { get; set; }
|
||||||
|
public string Message { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DiffTableInfo
|
||||||
|
{
|
||||||
|
public DbTableInfo OldTableInfo { get; set; }
|
||||||
|
public DbTableInfo NewTableInfo { get; set; }
|
||||||
|
public List<DbColumnInfo> OldColumnInfos { get; set; }
|
||||||
|
public List<DbColumnInfo> NewColumnInfos { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@@ -18,5 +18,7 @@ namespace SqlSugar
|
|||||||
void InitTables<T, T2, T3>();
|
void InitTables<T, T2, T3>();
|
||||||
void InitTables<T, T2, T3, T4>();
|
void InitTables<T, T2, T3, T4>();
|
||||||
SplitCodeFirstProvider SplitTables();
|
SplitCodeFirstProvider SplitTables();
|
||||||
|
TableDifferenceProvider GetDifferenceTables<T>();
|
||||||
|
TableDifferenceProvider GetDifferenceTables(params Type[] types);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -71,6 +71,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Abstract\AopProvider\AopProvider.cs" />
|
<Compile Include="Abstract\AopProvider\AopProvider.cs" />
|
||||||
<Compile Include="Abstract\CacheProvider\CacheProvider.cs" />
|
<Compile Include="Abstract\CacheProvider\CacheProvider.cs" />
|
||||||
|
<Compile Include="Abstract\CodeFirstProvider\TableDifferenceProvider.cs" />
|
||||||
<Compile Include="Abstract\CodeFirstProvider\CodeFirstProvider.cs" />
|
<Compile Include="Abstract\CodeFirstProvider\CodeFirstProvider.cs" />
|
||||||
<Compile Include="Abstract\AdoProvider\AdoAccessory.cs" />
|
<Compile Include="Abstract\AdoProvider\AdoAccessory.cs" />
|
||||||
<Compile Include="Abstract\CodeFirstProvider\SplitCodeFirstProvider.cs" />
|
<Compile Include="Abstract\CodeFirstProvider\SplitCodeFirstProvider.cs" />
|
||||||
|
Reference in New Issue
Block a user