From 12e07110ff6ed36f6d5b99183369c5d8e86bcb64 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 3 Mar 2025 15:09:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A8=E5=86=85=E5=AE=B9=E5=8F=98=E5=8C=96?= =?UTF-8?q?=E8=AE=B0=E5=BD=95(add/edit/remove)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AggregateRootUtils.cs | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootUtils.cs b/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootUtils.cs index 54a35455c..1a53c3cf3 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootUtils.cs +++ b/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootUtils.cs @@ -356,6 +356,7 @@ namespace FreeSql public static void MapEntityValue(string boundaryName, IFreeSql fsql, Type rootEntityType, object rootEntityFrom, object rootEntityTo) { + var isDict = rootEntityTo?.GetType() == typeof(Dictionary); Dictionary> ignores = new Dictionary>(); LocalMapEntityValue(rootEntityType, rootEntityFrom, rootEntityTo, true); ignores.Clear(); @@ -363,7 +364,7 @@ namespace FreeSql void LocalMapEntityValue(Type entityType, object entityFrom, object entityTo, bool cascade) { if (entityFrom == null || entityTo == null) return; - if (entityType == null) entityType = entityFrom?.GetType() ?? entityTo?.GetType(); + if (entityType == null) entityType = entityFrom.GetType(); var table = fsql.CodeFirst.GetTableByEntity(entityType); if (table == null) return; @@ -377,7 +378,8 @@ namespace FreeSql if (table.ColumnsByCsIgnore.ContainsKey(prop.Name)) continue; if (table.ColumnsByCs.ContainsKey(prop.Name)) { - table.SetPropertyValue(entityTo, prop.Name, table.GetPropertyValue(entityFrom, prop.Name)); + if (isDict) (entityTo as Dictionary)[prop.Name] = table.GetPropertyValue(entityFrom, prop.Name); + else table.SetPropertyValue(entityTo, prop.Name, table.GetPropertyValue(entityFrom, prop.Name)); continue; } if (cascade == false) continue; @@ -388,16 +390,18 @@ namespace FreeSql var propvalFrom = EntityUtilExtensions.GetEntityValueWithPropertyName(fsql, entityType, entityFrom, prop.Name); if (propvalFrom == null) { - EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, null); + if (isDict) (entityTo as Dictionary)[prop.Name] = null; + else EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, null); continue; } switch (tbref.RefType) { case TableRefType.OneToOne: - var propvalTo = tbref.RefEntityType.CreateInstanceGetDefaultValue(); + var propvalTo = isDict ? new Dictionary() : tbref.RefEntityType.CreateInstanceGetDefaultValue(); SetNavigateRelationshipValue(fsql, tbref, table.Type, entityFrom, propvalFrom); LocalMapEntityValue(tbref.RefEntityType, propvalFrom, propvalTo, boundaryAttr?.BreakThen != true); - EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, propvalTo); + if (isDict) (entityTo as Dictionary)[prop.Name] = null; + else EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, propvalTo); break; case TableRefType.OneToMany: SetNavigateRelationshipValue(fsql, tbref, table.Type, entityFrom, propvalFrom); @@ -414,22 +418,36 @@ namespace FreeSql } void LocalMapEntityValueCollection(Type entityType, object entityFrom, object entityTo, TableRef tbref, IEnumerable propvalFrom, PropertyInfo prop, bool cascade) { - var propvalTo = typeof(List<>).MakeGenericType(tbref.RefEntityType).CreateInstanceGetDefaultValue(); - var propvalToIList = propvalTo as IList; - foreach (var fromItem in propvalFrom) + if (isDict) { - var toItem = tbref.RefEntityType.CreateInstanceGetDefaultValue(); - LocalMapEntityValue(tbref.RefEntityType, fromItem, toItem, cascade); - propvalToIList.Add(toItem); + var propvalTo = new List>(); + foreach (var fromItem in propvalFrom) + { + var toItem = new Dictionary(); + LocalMapEntityValue(tbref.RefEntityType, fromItem, toItem, cascade); + propvalTo.Add(toItem); + } + (entityTo as Dictionary)[prop.Name] = propvalTo; } - var propvalType = prop.PropertyType.GetGenericTypeDefinition(); - if (propvalType == typeof(List<>) || propvalType == typeof(ICollection<>)) - EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, propvalTo); - else if (propvalType == typeof(ObservableCollection<>)) + else { - //var propvalTypeOcCtor = typeof(ObservableCollection<>).MakeGenericType(tbref.RefEntityType).GetConstructor(new[] { typeof(List<>).MakeGenericType(tbref.RefEntityType) }); - var propvalTypeOc = Activator.CreateInstance(typeof(ObservableCollection<>).MakeGenericType(tbref.RefEntityType), new object[] { propvalTo }); - EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, propvalTypeOc); + var propvalTo = typeof(List<>).MakeGenericType(tbref.RefEntityType).CreateInstanceGetDefaultValue(); + var propvalToIList = propvalTo as IList; + foreach (var fromItem in propvalFrom) + { + var toItem = tbref.RefEntityType.CreateInstanceGetDefaultValue(); + LocalMapEntityValue(tbref.RefEntityType, fromItem, toItem, cascade); + propvalToIList.Add(toItem); + } + var propvalType = prop.PropertyType.GetGenericTypeDefinition(); + if (propvalType == typeof(List<>) || propvalType == typeof(ICollection<>)) + EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, propvalTo); + else if (propvalType == typeof(ObservableCollection<>)) + { + //var propvalTypeOcCtor = typeof(ObservableCollection<>).MakeGenericType(tbref.RefEntityType).GetConstructor(new[] { typeof(List<>).MakeGenericType(tbref.RefEntityType) }); + var propvalTypeOc = Activator.CreateInstance(typeof(ObservableCollection<>).MakeGenericType(tbref.RefEntityType), new object[] { propvalTo }); + EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, propvalTypeOc); + } } } }