mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
AggregateRootRepository
This commit is contained in:
parent
c6016a671b
commit
32777b7543
@ -176,13 +176,12 @@ namespace FreeSql
|
|||||||
{
|
{
|
||||||
List<NativeTuple<Type, object>> insertLog = new List<NativeTuple<Type, object>>();
|
List<NativeTuple<Type, object>> insertLog = new List<NativeTuple<Type, object>>();
|
||||||
List<NativeTuple<Type, object, object, List<string>>> updateLog = new List<NativeTuple<Type, object, object, List<string>>>();
|
List<NativeTuple<Type, object, object, List<string>>> updateLog = new List<NativeTuple<Type, object, object, List<string>>>();
|
||||||
List<NativeTuple<Type, object>> deleteLog = new List<NativeTuple<Type, object>>();
|
List<NativeTuple<Type, object[]>> deleteLog = new List<NativeTuple<Type, object[]>>();
|
||||||
foreach(var entity in entitys)
|
foreach(var entity in entitys)
|
||||||
{
|
{
|
||||||
var stateKey = Orm.GetEntityKeyString(EntityType, entity, false);
|
var stateKey = Orm.GetEntityKeyString(EntityType, entity, false);
|
||||||
if (_states.TryGetValue(stateKey, out var state) == false) throw new Exception($"AggregateRootRepository 使用仓储对象查询后,才可以更新数据 {Orm.GetEntityString(EntityType, entity)}");
|
if (_states.TryGetValue(stateKey, out var state) == false) throw new Exception($"AggregateRootRepository 使用仓储对象查询后,才可以更新数据 {Orm.GetEntityString(EntityType, entity)}");
|
||||||
AggregateRootUtils.CompareEntityValue(Orm, EntityType, state.Value, entity, null, insertLog, updateLog, deleteLog);
|
AggregateRootUtils.CompareEntityValue(Orm, EntityType, state.Value, entity, null, insertLog, updateLog, deleteLog);
|
||||||
Attach(entity);
|
|
||||||
}
|
}
|
||||||
var affrows = 0;
|
var affrows = 0;
|
||||||
|
|
||||||
@ -193,11 +192,9 @@ namespace FreeSql
|
|||||||
InsertAggregateRootStatic(GetChildRepository(il.Key), GetChildRepository, il.Value, out var affrowsOut);
|
InsertAggregateRootStatic(GetChildRepository(il.Key), GetChildRepository, il.Value, out var affrowsOut);
|
||||||
affrows += affrowsOut;
|
affrows += affrowsOut;
|
||||||
}
|
}
|
||||||
DisposeChildRepositorys();
|
|
||||||
|
|
||||||
var deleteLogDict = deleteLog.GroupBy(a => a.Item1).ToDictionary(a => a.Key, a => deleteLog.Where(b => b.Item1 == a.Key).Select(b => b.Item2).ToArray());
|
for (var a = 0; a < deleteLog.Count - 1; a++)
|
||||||
foreach (var dl in deleteLogDict)
|
affrows += Orm.Delete<object>().AsType(deleteLog[a].Item1).WhereDynamic(deleteLog[a].Item2).ExecuteAffrows();
|
||||||
affrows += Orm.Delete<object>().AsType(dl.Key).WhereDynamic(dl.Value).ExecuteAffrows();
|
|
||||||
|
|
||||||
var updateLogDict = updateLog.GroupBy(a => a.Item1).ToDictionary(a => a.Key, a => updateLog.Where(b => b.Item1 == a.Key).Select(b =>
|
var updateLogDict = updateLog.GroupBy(a => a.Item1).ToDictionary(a => a.Key, a => updateLog.Where(b => b.Item1 == a.Key).Select(b =>
|
||||||
NativeTuple.Create(b.Item2, b.Item3, string.Join(",", b.Item4.OrderBy(c => c)), b.Item4)).ToArray());
|
NativeTuple.Create(b.Item2, b.Item3, string.Join(",", b.Item4.OrderBy(c => c)), b.Item4)).ToArray());
|
||||||
@ -212,13 +209,17 @@ namespace FreeSql
|
|||||||
.ExecuteAffrows();
|
.ExecuteAffrows();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
DisposeChildRepositorys();
|
||||||
|
foreach (var entity in entitys)
|
||||||
|
Attach(entity);
|
||||||
|
|
||||||
return affrows;
|
return affrows;
|
||||||
}
|
}
|
||||||
protected virtual int DeleteAggregateRoot(IEnumerable<TEntity> entitys, List<object> deletedOutput = null)
|
protected virtual int DeleteAggregateRoot(IEnumerable<TEntity> entitys, List<object> deletedOutput = null)
|
||||||
{
|
{
|
||||||
List<NativeTuple<Type, object>> insertLog = new List<NativeTuple<Type, object>>();
|
List<NativeTuple<Type, object>> insertLog = new List<NativeTuple<Type, object>>();
|
||||||
List<NativeTuple<Type, object, object, List<string>>> updateLog = new List<NativeTuple<Type, object, object, List<string>>>();
|
List<NativeTuple<Type, object, object, List<string>>> updateLog = new List<NativeTuple<Type, object, object, List<string>>>();
|
||||||
List<NativeTuple<Type, object>> deleteLog = new List<NativeTuple<Type, object>>();
|
List<NativeTuple<Type, object[]>> deleteLog = new List<NativeTuple<Type, object[]>>();
|
||||||
foreach (var entity in entitys)
|
foreach (var entity in entitys)
|
||||||
{
|
{
|
||||||
var stateKey = Orm.GetEntityKeyString(EntityType, entity, false);
|
var stateKey = Orm.GetEntityKeyString(EntityType, entity, false);
|
||||||
@ -233,7 +234,7 @@ namespace FreeSql
|
|||||||
{
|
{
|
||||||
List<NativeTuple<Type, object>> insertLog = new List<NativeTuple<Type, object>>();
|
List<NativeTuple<Type, object>> insertLog = new List<NativeTuple<Type, object>>();
|
||||||
List<NativeTuple<Type, object, object, List<string>>> updateLog = new List<NativeTuple<Type, object, object, List<string>>>();
|
List<NativeTuple<Type, object, object, List<string>>> updateLog = new List<NativeTuple<Type, object, object, List<string>>>();
|
||||||
List<NativeTuple<Type, object>> deleteLog = new List<NativeTuple<Type, object>>();
|
List<NativeTuple<Type, object[]>> deleteLog = new List<NativeTuple<Type, object[]>>();
|
||||||
var stateKey = Orm.GetEntityKeyString(EntityType, entity, false);
|
var stateKey = Orm.GetEntityKeyString(EntityType, entity, false);
|
||||||
if (_states.TryGetValue(stateKey, out var state) == false) throw new Exception($"AggregateRootRepository 使用仓储对象查询后,才可以保存数据 {Orm.GetEntityString(EntityType, entity)}");
|
if (_states.TryGetValue(stateKey, out var state) == false) throw new Exception($"AggregateRootRepository 使用仓储对象查询后,才可以保存数据 {Orm.GetEntityString(EntityType, entity)}");
|
||||||
AggregateRootUtils.CompareEntityValue(Orm, EntityType, state.Value, entity, propertyName, insertLog, updateLog, deleteLog);
|
AggregateRootUtils.CompareEntityValue(Orm, EntityType, state.Value, entity, propertyName, insertLog, updateLog, deleteLog);
|
||||||
@ -268,7 +269,7 @@ namespace FreeSql
|
|||||||
if (data == null) return 0;
|
if (data == null) return 0;
|
||||||
List<NativeTuple<Type, object>> insertLog = new List<NativeTuple<Type, object>>();
|
List<NativeTuple<Type, object>> insertLog = new List<NativeTuple<Type, object>>();
|
||||||
List<NativeTuple<Type, object, object, List<string>>> updateLog = new List<NativeTuple<Type, object, object, List<string>>>();
|
List<NativeTuple<Type, object, object, List<string>>> updateLog = new List<NativeTuple<Type, object, object, List<string>>>();
|
||||||
List<NativeTuple<Type, object>> deleteLog = new List<NativeTuple<Type, object>>();
|
List<NativeTuple<Type, object[]>> deleteLog = new List<NativeTuple<Type, object[]>>();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var addList = new List<TEntity>();
|
var addList = new List<TEntity>();
|
||||||
|
@ -15,7 +15,7 @@ static class AggregateRootUtils
|
|||||||
public static void CompareEntityValue(IFreeSql fsql, Type rootEntityType, object rootEntityBefore, object rootEntityAfter, string rootNavigatePropertyName,
|
public static void CompareEntityValue(IFreeSql fsql, Type rootEntityType, object rootEntityBefore, object rootEntityAfter, string rootNavigatePropertyName,
|
||||||
List<NativeTuple<Type, object>> insertLog,
|
List<NativeTuple<Type, object>> insertLog,
|
||||||
List<NativeTuple<Type, object, object, List<string>>> updateLog,
|
List<NativeTuple<Type, object, object, List<string>>> updateLog,
|
||||||
List<NativeTuple<Type, object>> deleteLog)
|
List<NativeTuple<Type, object[]>> deleteLog)
|
||||||
{
|
{
|
||||||
Dictionary<Type, Dictionary<string, bool>> ignores = new Dictionary<Type, Dictionary<string, bool>>();
|
Dictionary<Type, Dictionary<string, bool>> ignores = new Dictionary<Type, Dictionary<string, bool>>();
|
||||||
LocalCompareEntityValue(rootEntityType, rootEntityBefore, rootEntityAfter, rootNavigatePropertyName);
|
LocalCompareEntityValue(rootEntityType, rootEntityBefore, rootEntityAfter, rootNavigatePropertyName);
|
||||||
@ -50,10 +50,11 @@ static class AggregateRootUtils
|
|||||||
}
|
}
|
||||||
if (entityBefore != null && entityAfter == null)
|
if (entityBefore != null && entityAfter == null)
|
||||||
{
|
{
|
||||||
deleteLog.Add(NativeTuple.Create(entityType, entityBefore));
|
deleteLog.Add(NativeTuple.Create(entityType, new[] { entityBefore }));
|
||||||
NavigateReader(fsql, entityType, entityBefore, (path, tr, ct, stackvs) =>
|
NavigateReader(fsql, entityType, entityBefore, (path, tr, ct, stackvs) =>
|
||||||
{
|
{
|
||||||
deleteLog.Add(NativeTuple.Create(ct, stackvs.First()));
|
var dellist = stackvs.First() as object[] ?? new[] { stackvs.First() };
|
||||||
|
deleteLog.Add(NativeTuple.Create(ct, dellist));
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -83,9 +84,13 @@ static class AggregateRootUtils
|
|||||||
switch (tbref.RefType)
|
switch (tbref.RefType)
|
||||||
{
|
{
|
||||||
case TableRefType.OneToOne:
|
case TableRefType.OneToOne:
|
||||||
|
SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityBefore, propvalBefore);
|
||||||
|
SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityAfter, propvalAfter);
|
||||||
LocalCompareEntityValue(tbref.RefEntityType, propvalBefore, propvalAfter, null);
|
LocalCompareEntityValue(tbref.RefEntityType, propvalBefore, propvalAfter, null);
|
||||||
break;
|
break;
|
||||||
case TableRefType.OneToMany:
|
case TableRefType.OneToMany:
|
||||||
|
SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityBefore, propvalBefore);
|
||||||
|
SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityAfter, propvalAfter);
|
||||||
LocalCompareEntityValueCollection(tbref, propvalBefore as IEnumerable, propvalAfter as IEnumerable);
|
LocalCompareEntityValueCollection(tbref, propvalBefore as IEnumerable, propvalAfter as IEnumerable);
|
||||||
break;
|
break;
|
||||||
case TableRefType.ManyToMany:
|
case TableRefType.ManyToMany:
|
||||||
@ -113,10 +118,11 @@ static class AggregateRootUtils
|
|||||||
{
|
{
|
||||||
foreach (var item in collectionBefore as IEnumerable)
|
foreach (var item in collectionBefore as IEnumerable)
|
||||||
{
|
{
|
||||||
deleteLog.Add(NativeTuple.Create(elementType, item));
|
deleteLog.Add(NativeTuple.Create(elementType, new[] { item }));
|
||||||
NavigateReader(fsql, elementType, item, (path, tr, ct, stackvs) =>
|
NavigateReader(fsql, elementType, item, (path, tr, ct, stackvs) =>
|
||||||
{
|
{
|
||||||
deleteLog.Add(NativeTuple.Create(ct, stackvs.First()));
|
var dellist = stackvs.First() as object[] ?? new [] { stackvs.First() };
|
||||||
|
deleteLog.Add(NativeTuple.Create(ct, dellist));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -139,10 +145,11 @@ static class AggregateRootUtils
|
|||||||
if (dictAfter.ContainsKey(key) == false)
|
if (dictAfter.ContainsKey(key) == false)
|
||||||
{
|
{
|
||||||
var value = dictBefore[key];
|
var value = dictBefore[key];
|
||||||
deleteLog.Add(NativeTuple.Create(elementType, value));
|
deleteLog.Add(NativeTuple.Create(elementType, new[] { value }));
|
||||||
NavigateReader(fsql, elementType, value, (path, tr, ct, stackvs) =>
|
NavigateReader(fsql, elementType, value, (path, tr, ct, stackvs) =>
|
||||||
{
|
{
|
||||||
deleteLog.Add(NativeTuple.Create(ct, stackvs.First()));
|
var dellist = stackvs.First() as object[] ?? new[] { stackvs.First() };
|
||||||
|
deleteLog.Add(NativeTuple.Create(ct, dellist));
|
||||||
});
|
});
|
||||||
dictBefore.Remove(key);
|
dictBefore.Remove(key);
|
||||||
}
|
}
|
||||||
@ -186,39 +193,39 @@ static class AggregateRootUtils
|
|||||||
{
|
{
|
||||||
var tbref = table.GetTableRef(prop.Name, false);
|
var tbref = table.GetTableRef(prop.Name, false);
|
||||||
if (tbref == null) continue;
|
if (tbref == null) continue;
|
||||||
var idx = 0;
|
|
||||||
switch (tbref.RefType)
|
switch (tbref.RefType)
|
||||||
{
|
{
|
||||||
case TableRefType.OneToOne:
|
case TableRefType.OneToOne:
|
||||||
var propval = table.GetPropertyValue(entity, prop.Name);
|
var propval = table.GetPropertyValue(entity, prop.Name);
|
||||||
statckPath.Push(prop.Name);
|
statckPath.Push(prop.Name);
|
||||||
stackValues.Add(propval);
|
stackValues.Add(propval);
|
||||||
|
SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entity, propval);
|
||||||
callback?.Invoke(string.Join(".", statckPath), tbref, tbref.RefEntityType, stackValues);
|
callback?.Invoke(string.Join(".", statckPath), tbref, tbref.RefEntityType, stackValues);
|
||||||
LocalNavigateReader(tbref.RefEntityType, propval);
|
LocalNavigateReader(tbref.RefEntityType, propval);
|
||||||
stackValues.RemoveAt(stackValues.Count - 1);
|
stackValues.RemoveAt(stackValues.Count - 1);
|
||||||
statckPath.Pop();
|
statckPath.Pop();
|
||||||
break;
|
break;
|
||||||
case TableRefType.OneToMany:
|
case TableRefType.OneToMany:
|
||||||
foreach (var val in table.GetPropertyValue(entity, prop.Name) as IEnumerable)
|
var propvalOtm = table.GetPropertyValue(entity, prop.Name);
|
||||||
{
|
SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entity, propvalOtm);
|
||||||
statckPath.Push($"{prop.Name[idx++]}");
|
var propvalOtmList = new List<object>();
|
||||||
stackValues.Add(val);
|
foreach (var val in propvalOtm as IEnumerable)
|
||||||
|
propvalOtmList.Add(val);
|
||||||
|
statckPath.Push($"{prop.Name}[]");
|
||||||
|
stackValues.Add(propvalOtmList.ToArray());
|
||||||
callback?.Invoke(string.Join(".", statckPath), tbref, tbref.RefEntityType, stackValues);
|
callback?.Invoke(string.Join(".", statckPath), tbref, tbref.RefEntityType, stackValues);
|
||||||
|
foreach (var val in propvalOtm as IEnumerable)
|
||||||
LocalNavigateReader(tbref.RefEntityType, val);
|
LocalNavigateReader(tbref.RefEntityType, val);
|
||||||
stackValues.RemoveAt(stackValues.Count - 1);
|
stackValues.RemoveAt(stackValues.Count - 1);
|
||||||
statckPath.Pop();
|
statckPath.Pop();
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case TableRefType.ManyToMany:
|
case TableRefType.ManyToMany:
|
||||||
var middleValues = GetManyToManyObjects(fsql, table, tbref, entity, prop);
|
var middleValues = GetManyToManyObjects(fsql, table, tbref, entity, prop).ToArray();
|
||||||
foreach (var midval in middleValues)
|
statckPath.Push($"{prop.Name}[]");
|
||||||
{
|
stackValues.Add(middleValues);
|
||||||
statckPath.Push($"{prop.Name[idx++]}");
|
callback?.Invoke(string.Join(".", statckPath), tbref, tbref.RefEntityType, stackValues);
|
||||||
stackValues.Add(midval);
|
|
||||||
callback?.Invoke(string.Join(".", statckPath), tbref, tbref.RefMiddleEntityType, stackValues);
|
|
||||||
stackValues.RemoveAt(stackValues.Count - 1);
|
stackValues.RemoveAt(stackValues.Count - 1);
|
||||||
statckPath.Pop();
|
statckPath.Pop();
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case TableRefType.PgArrayToMany:
|
case TableRefType.PgArrayToMany:
|
||||||
case TableRefType.ManyToOne: //不属于聚合根
|
case TableRefType.ManyToOne: //不属于聚合根
|
||||||
@ -266,14 +273,16 @@ static class AggregateRootUtils
|
|||||||
{
|
{
|
||||||
case TableRefType.OneToOne:
|
case TableRefType.OneToOne:
|
||||||
var propvalTo = tbref.RefEntityType.CreateInstanceGetDefaultValue();
|
var propvalTo = tbref.RefEntityType.CreateInstanceGetDefaultValue();
|
||||||
|
SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityFrom, propvalFrom);
|
||||||
LocalMapEntityValue(tbref.RefEntityType, propvalFrom, propvalTo);
|
LocalMapEntityValue(tbref.RefEntityType, propvalFrom, propvalTo);
|
||||||
EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, propvalTo);
|
EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, propvalTo);
|
||||||
break;
|
break;
|
||||||
case TableRefType.OneToMany:
|
case TableRefType.OneToMany:
|
||||||
LocalMapEntityValueCollection(entityType, entityFrom, entityTo, tbref, propvalFrom, prop, true);
|
SetNavigateRelationshipValue(fsql, tbref, tbref.RefEntityType, entityFrom, propvalFrom);
|
||||||
|
LocalMapEntityValueCollection(entityType, entityFrom, entityTo, tbref, propvalFrom as IEnumerable, prop, true);
|
||||||
break;
|
break;
|
||||||
case TableRefType.ManyToMany:
|
case TableRefType.ManyToMany:
|
||||||
LocalMapEntityValueCollection(entityType, entityFrom, entityTo, tbref, propvalFrom, prop, false);
|
LocalMapEntityValueCollection(entityType, entityFrom, entityTo, tbref, propvalFrom as IEnumerable, prop, false);
|
||||||
break;
|
break;
|
||||||
case TableRefType.PgArrayToMany:
|
case TableRefType.PgArrayToMany:
|
||||||
case TableRefType.ManyToOne: //不属于聚合根
|
case TableRefType.ManyToOne: //不属于聚合根
|
||||||
@ -281,12 +290,11 @@ static class AggregateRootUtils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void LocalMapEntityValueCollection(Type entityType, object entityFrom, object entityTo, TableRef tbref, object propvalFrom, PropertyInfo prop, bool cascade)
|
void LocalMapEntityValueCollection(Type entityType, object entityFrom, object entityTo, TableRef tbref, IEnumerable propvalFrom, PropertyInfo prop, bool cascade)
|
||||||
{
|
{
|
||||||
var propvalFromEach = propvalFrom as IEnumerable;
|
|
||||||
var propvalTo = typeof(List<>).MakeGenericType(tbref.RefEntityType).CreateInstanceGetDefaultValue();
|
var propvalTo = typeof(List<>).MakeGenericType(tbref.RefEntityType).CreateInstanceGetDefaultValue();
|
||||||
var propvalToIList = propvalTo as IList;
|
var propvalToIList = propvalTo as IList;
|
||||||
foreach (var fromItem in propvalFromEach)
|
foreach (var fromItem in propvalFrom)
|
||||||
{
|
{
|
||||||
var toItem = tbref.RefEntityType.CreateInstanceGetDefaultValue();
|
var toItem = tbref.RefEntityType.CreateInstanceGetDefaultValue();
|
||||||
if (cascade) LocalMapEntityValue(tbref.RefEntityType, fromItem, toItem);
|
if (cascade) LocalMapEntityValue(tbref.RefEntityType, fromItem, toItem);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user