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)