mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 20:38:16 +08:00
- 增加 ICodeFirst.SyncStructure(TableInfo) 重载方法迁移表结构;
This commit is contained in:
@ -50,19 +50,21 @@ namespace FreeSql.Internal.CommonProvider
|
||||
return tableName;
|
||||
}
|
||||
public string GetComparisonDDLStatements<TEntity>() =>
|
||||
this.GetComparisonDDLStatements(new TypeAndName(typeof(TEntity), ""));
|
||||
this.GetComparisonDDLStatements(new TypeSchemaAndName(GetTableByEntity(typeof(TEntity)), ""));
|
||||
public string GetComparisonDDLStatements(params Type[] entityTypes) => entityTypes == null ? null :
|
||||
this.GetComparisonDDLStatements(entityTypes.Distinct().Select(a => new TypeAndName(a, "")).ToArray());
|
||||
this.GetComparisonDDLStatements(entityTypes.Distinct().Select(a => new TypeSchemaAndName(GetTableByEntity(a), "")).ToArray());
|
||||
public string GetComparisonDDLStatements(Type entityType, string tableName) =>
|
||||
this.GetComparisonDDLStatements(new TypeAndName(entityType, GetTableNameLowerOrUpper(tableName)));
|
||||
protected abstract string GetComparisonDDLStatements(params TypeAndName[] objects);
|
||||
public class TypeAndName
|
||||
this.GetComparisonDDLStatements(new TypeSchemaAndName(GetTableByEntity(entityType), GetTableNameLowerOrUpper(tableName)));
|
||||
public string GetComparisonDDLStatements(TableInfo tableSchema, string tableName) =>
|
||||
this.GetComparisonDDLStatements(new TypeSchemaAndName(tableSchema, GetTableNameLowerOrUpper(tableName)));
|
||||
protected abstract string GetComparisonDDLStatements(params TypeSchemaAndName[] objects);
|
||||
public class TypeSchemaAndName
|
||||
{
|
||||
public Type entityType { get; }
|
||||
public TableInfo tableSchema { get; }
|
||||
public string tableName { get; }
|
||||
public TypeAndName(Type entityType, string tableName)
|
||||
public TypeSchemaAndName(TableInfo tableSchema, string tableName)
|
||||
{
|
||||
this.entityType = entityType;
|
||||
this.tableSchema = tableSchema;
|
||||
this.tableName = tableName;
|
||||
}
|
||||
}
|
||||
@ -82,24 +84,33 @@ namespace FreeSql.Internal.CommonProvider
|
||||
_dicSycedGetOrAdd(entityType).TryAdd(GetTableNameLowerOrUpper(tableName), true);
|
||||
|
||||
public void SyncStructure<TEntity>() =>
|
||||
this.SyncStructure(new TypeAndName(typeof(TEntity), ""));
|
||||
this.SyncStructure(new TypeSchemaAndName(GetTableByEntity(typeof(TEntity)), ""));
|
||||
public void SyncStructure(params Type[] entityTypes) =>
|
||||
this.SyncStructure(entityTypes?.Distinct().Select(a => new TypeAndName(a, "")).ToArray());
|
||||
public void SyncStructure(Type entityType, string tableName, bool isForceSync)
|
||||
this.SyncStructure(entityTypes?.Distinct().Select(a => new TypeSchemaAndName(GetTableByEntity(a), "")).ToArray());
|
||||
public void SyncStructure(Type entityType, string tableName, bool isForceSync) =>
|
||||
this.SyncStructure(GetTableByEntity(entityType), tableName, isForceSync);
|
||||
public void SyncStructure(TableInfo tableSchema, string tableName, bool isForceSync = false)
|
||||
{
|
||||
tableName = GetTableNameLowerOrUpper(tableName);
|
||||
if (isForceSync && _dicSynced.TryGetValue(entityType, out var dic)) dic.TryRemove(tableName, out var old);
|
||||
this.SyncStructure(new TypeAndName(entityType, tableName));
|
||||
}
|
||||
protected void SyncStructure(params TypeAndName[] objects)
|
||||
if (isForceSync && tableSchema?.Type != null && _dicSynced.TryGetValue(tableSchema.Type, out var dic)) dic.TryRemove(tableName, out var old);
|
||||
this.SyncStructure(new TypeSchemaAndName(tableSchema, tableName));
|
||||
}
|
||||
|
||||
protected void SyncStructure(params TypeSchemaAndName[] objects)
|
||||
{
|
||||
if (objects == null) return;
|
||||
var syncObjects = objects.Where(a => a.entityType != null && a.entityType != typeof(object) && _dicSycedGetOrAdd(a.entityType).ContainsKey(GetTableNameLowerOrUpper(a.tableName)) == false && GetTableByEntity(a.entityType)?.DisableSyncStructure == false)
|
||||
.Select(a => new TypeAndName(a.entityType, GetTableNameLowerOrUpper(a.tableName)))
|
||||
.Where(a => !(string.IsNullOrEmpty(a.tableName) == true && GetTableByEntity(a.entityType)?.AsTableImpl != null))
|
||||
var syncObjects = objects.Where(a => a.tableSchema?.Type != null &&
|
||||
(
|
||||
a.tableSchema.Type.Name == "DynamicRepository" && a.tableSchema.Columns.Any()
|
||||
||
|
||||
a.tableSchema.Type != typeof(object) && _dicSycedGetOrAdd(a.tableSchema.Type).ContainsKey(GetTableNameLowerOrUpper(a.tableName)) == false
|
||||
) &&
|
||||
a.tableSchema?.DisableSyncStructure == false)
|
||||
.Select(a => new TypeSchemaAndName(a.tableSchema, GetTableNameLowerOrUpper(a.tableName)))
|
||||
.Where(a => !(string.IsNullOrEmpty(a.tableName) == true && a.tableSchema?.AsTableImpl != null))
|
||||
.ToArray();
|
||||
if (syncObjects.Any() == false) return;
|
||||
var before = new Aop.SyncStructureBeforeEventArgs(syncObjects.Select(a => a.entityType).ToArray());
|
||||
var before = new Aop.SyncStructureBeforeEventArgs(syncObjects.Select(a => a.tableSchema.Type).ToArray());
|
||||
_orm.Aop.SyncStructureBeforeHandler?.Invoke(this, before);
|
||||
Exception exception = null;
|
||||
string ddl = null;
|
||||
@ -110,11 +121,11 @@ namespace FreeSql.Internal.CommonProvider
|
||||
ddl = this.GetComparisonDDLStatements(syncObjects);
|
||||
if (string.IsNullOrEmpty(ddl))
|
||||
{
|
||||
foreach (var syncObject in syncObjects) _dicSycedTryAdd(syncObject.entityType, syncObject.tableName);
|
||||
foreach (var syncObject in syncObjects) _dicSycedTryAdd(syncObject.tableSchema.Type, syncObject.tableName);
|
||||
return;
|
||||
}
|
||||
var affrows = ExecuteDDLStatements(ddl);
|
||||
foreach (var syncObject in syncObjects) _dicSycedTryAdd(syncObject.entityType, syncObject.tableName);
|
||||
foreach (var syncObject in syncObjects) _dicSycedTryAdd(syncObject.tableSchema.Type, syncObject.tableName);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user