From b45360bfbe37e8d2d717ae74f78c215cb6ec7bf5 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 6 Mar 2020 00:15:35 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20DbContext/Repository?= =?UTF-8?q?=20SaveMany=20=E4=B8=80=E5=AF=B9=E5=A4=9A=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=97=B6=E5=88=A0=E9=99=A4=E6=9D=A1=E4=BB=B6=20bug=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/DbSet/DbSetAsync.cs | 17 ++++++++++++++++- FreeSql.DbContext/DbSet/DbSetSync.cs | 17 ++++++++++++++++- FreeSql.Tests/FreeSql.Tests/UnitTest1.cs | 4 +++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 68d6b0bb..cec6c1b2 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -158,10 +158,25 @@ namespace FreeSql if (tref.RefType == Internal.Model.TableRefType.OneToMany) { await DbContextExecCommandAsync(); - //删除没有保存的数据 + //删除没有保存的数据,求出主体的条件 + var deleteWhereParentParam = Expression.Parameter(typeof(object), "a"); + Expression whereParentExp = null; + for (var colidx = 0; colidx < tref.Columns.Count; colidx++) + { + var whereExp = Expression.Equal( + Expression.MakeMemberAccess(Expression.Convert(deleteWhereParentParam, tref.RefEntityType), tref.RefColumns[colidx].Table.Properties[tref.RefColumns[colidx].CsName]), + Expression.Constant( + FreeSql.Internal.Utils.GetDataReaderValue( + tref.Columns[colidx].CsType, + _db.Orm.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)), tref.RefColumns[colidx].CsType) + ); + if (whereParentExp == null) whereParentExp = whereExp; + else whereParentExp = Expression.AndAlso(whereParentExp, whereExp); + } var propValEach = GetItemValue(item, prop) as IEnumerable; await _db.Orm.Delete().AsType(tref.RefEntityType) .WithTransaction(_uow?.GetOrBeginTransaction()) + .Where(Expression.Lambda>(whereParentExp, deleteWhereParentParam)) .WhereDynamic(propValEach, true).ExecuteAffrowsAsync(); } } diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 603e1fda..10a10f57 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -170,10 +170,25 @@ namespace FreeSql if (tref.RefType == Internal.Model.TableRefType.OneToMany) { DbContextExecCommand(); - //删除没有保存的数据 + //删除没有保存的数据,求出主体的条件 + var deleteWhereParentParam = Expression.Parameter(typeof(object), "a"); + Expression whereParentExp = null; + for (var colidx = 0; colidx < tref.Columns.Count; colidx++) + { + var whereExp = Expression.Equal( + Expression.MakeMemberAccess(Expression.Convert(deleteWhereParentParam, tref.RefEntityType), tref.RefColumns[colidx].Table.Properties[tref.RefColumns[colidx].CsName]), + Expression.Constant( + FreeSql.Internal.Utils.GetDataReaderValue( + tref.Columns[colidx].CsType, + _db.Orm.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)), tref.RefColumns[colidx].CsType) + ); + if (whereParentExp == null) whereParentExp = whereExp; + else whereParentExp = Expression.AndAlso(whereParentExp, whereExp); + } var propValEach = GetItemValue(item, prop) as IEnumerable; _db.Orm.Delete().AsType(tref.RefEntityType) .WithTransaction(_uow?.GetOrBeginTransaction()) + .Where(Expression.Lambda>(whereParentExp, deleteWhereParentParam)) .WhereDynamic(propValEach, true).ExecuteAffrows(); } } diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index 37e30197..bc70c511 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -1092,7 +1092,9 @@ namespace FreeSql.Tests }) }; - g.mysql.GetRepository().Insert(neworder); + var repo = g.mysql.GetRepository(); + repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; + repo.Insert(neworder); var order = g.mysql.Select().Where(a => a.Id == neworder.Id).ToOne(); //查询订单表 if (order == null)