From 471bfb6081fa53e54742fd2ce95f795494e1bac0 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 12 May 2022 19:33:38 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20EnableCascadeSave=20?= =?UTF-8?q?=E7=BA=A7=E8=81=94=E4=BF=9D=E5=AD=98=E6=89=A7=E8=A1=8C=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=8F=90=E5=8D=87=E6=80=A7=E8=83=BD=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/DbSet/DbSetAsync.cs | 19 +++++++++++++++---- FreeSql.DbContext/DbSet/DbSetSync.cs | 19 +++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 6be0573c..47cd6777 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -328,7 +328,8 @@ namespace FreeSql } break; case Internal.Model.TableRefType.OneToMany: - var addlist = isAdd ? new List() : null; + var addList = new List(); + var addOrUpdateList = new List(); foreach (var propValItem in propValEach) { for (var colidx = 0; colidx < tref.Columns.Count; colidx++) @@ -336,10 +337,20 @@ namespace FreeSql var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)); _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val); } - if (isAdd) addlist.Add(propValItem); - else await refSet.AddOrUpdateAsync(propValItem, cancellationToken); + if (isAdd) addList.Add(propValItem); + else + { + var flagExists = refSet.ExistsInStates(propValItem); + if (flagExists == null) addList.Add(propValItem); //自增/Guid + else addOrUpdateList.Add(propValItem); //统一状态管理 + } + } + if (addList.Any()) await refSet.AddRangeAsync(addList, cancellationToken); + if (addOrUpdateList.Any()) + { + var existsList = await refSet.Select.WhereDynamic(addOrUpdateList).ToListAsync(false, cancellationToken); + foreach (var aouItem in addOrUpdateList) await refSet.AddOrUpdateAsync(aouItem, cancellationToken); } - if (isAdd) await refSet.AddRangeAsync(addlist, cancellationToken); break; } }; diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 740746e0..3dc17741 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -339,7 +339,8 @@ namespace FreeSql } break; case Internal.Model.TableRefType.OneToMany: - var addlist = isAdd ? new List() : null; + var addList = new List(); + var addOrUpdateList = new List(); foreach (var propValItem in propValEach) { for (var colidx = 0; colidx < tref.Columns.Count; colidx++) @@ -347,10 +348,20 @@ namespace FreeSql var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)); _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val); } - if (isAdd) addlist.Add(propValItem); - else refSet.AddOrUpdate(propValItem); + if (isAdd) addList.Add(propValItem); + else + { + var flagExists = refSet.ExistsInStates(propValItem); + if (flagExists == null) addList.Add(propValItem); //自增/Guid + else addOrUpdateList.Add(propValItem); //统一状态管理 + } + } + if (addList.Any()) refSet.AddRange(addList); + if (addOrUpdateList.Any()) + { + var existsList = refSet.Select.WhereDynamic(addOrUpdateList).ToList(); + foreach (var aouItem in addOrUpdateList) refSet.AddOrUpdate(aouItem); } - if (isAdd) refSet.AddRange(addlist); break; } };