Skip to content

Commit b45360b

Browse files
2881028810
authored andcommitted
- 修复 DbContext/Repository SaveMany 一对多保存时删除条件 bug;
1 parent fa3aa8e commit b45360b

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

FreeSql.DbContext/DbSet/DbSetAsync.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,25 @@ async public Task SaveManyAsync(TEntity item, string propertyName)
158158
if (tref.RefType == Internal.Model.TableRefType.OneToMany)
159159
{
160160
await DbContextExecCommandAsync();
161-
//删除没有保存的数据
161+
//删除没有保存的数据,求出主体的条件
162+
var deleteWhereParentParam = Expression.Parameter(typeof(object), "a");
163+
Expression whereParentExp = null;
164+
for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
165+
{
166+
var whereExp = Expression.Equal(
167+
Expression.MakeMemberAccess(Expression.Convert(deleteWhereParentParam, tref.RefEntityType), tref.RefColumns[colidx].Table.Properties[tref.RefColumns[colidx].CsName]),
168+
Expression.Constant(
169+
FreeSql.Internal.Utils.GetDataReaderValue(
170+
tref.Columns[colidx].CsType,
171+
_db.Orm.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)), tref.RefColumns[colidx].CsType)
172+
);
173+
if (whereParentExp == null) whereParentExp = whereExp;
174+
else whereParentExp = Expression.AndAlso(whereParentExp, whereExp);
175+
}
162176
var propValEach = GetItemValue(item, prop) as IEnumerable;
163177
await _db.Orm.Delete<object>().AsType(tref.RefEntityType)
164178
.WithTransaction(_uow?.GetOrBeginTransaction())
179+
.Where(Expression.Lambda<Func<object, bool>>(whereParentExp, deleteWhereParentParam))
165180
.WhereDynamic(propValEach, true).ExecuteAffrowsAsync();
166181
}
167182
}

FreeSql.DbContext/DbSet/DbSetSync.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,25 @@ public void SaveMany(TEntity item, string propertyName)
170170
if (tref.RefType == Internal.Model.TableRefType.OneToMany)
171171
{
172172
DbContextExecCommand();
173-
//删除没有保存的数据
173+
//删除没有保存的数据,求出主体的条件
174+
var deleteWhereParentParam = Expression.Parameter(typeof(object), "a");
175+
Expression whereParentExp = null;
176+
for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
177+
{
178+
var whereExp = Expression.Equal(
179+
Expression.MakeMemberAccess(Expression.Convert(deleteWhereParentParam, tref.RefEntityType), tref.RefColumns[colidx].Table.Properties[tref.RefColumns[colidx].CsName]),
180+
Expression.Constant(
181+
FreeSql.Internal.Utils.GetDataReaderValue(
182+
tref.Columns[colidx].CsType,
183+
_db.Orm.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)), tref.RefColumns[colidx].CsType)
184+
);
185+
if (whereParentExp == null) whereParentExp = whereExp;
186+
else whereParentExp = Expression.AndAlso(whereParentExp, whereExp);
187+
}
174188
var propValEach = GetItemValue(item, prop) as IEnumerable;
175189
_db.Orm.Delete<object>().AsType(tref.RefEntityType)
176190
.WithTransaction(_uow?.GetOrBeginTransaction())
191+
.Where(Expression.Lambda<Func<object, bool>>(whereParentExp, deleteWhereParentParam))
177192
.WhereDynamic(propValEach, true).ExecuteAffrows();
178193
}
179194
}

FreeSql.Tests/FreeSql.Tests/UnitTest1.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1092,7 +1092,9 @@ orderby p.CustomerName ascending
10921092
})
10931093
};
10941094

1095-
g.mysql.GetRepository<Order>().Insert(neworder);
1095+
var repo = g.mysql.GetRepository<Order>();
1096+
repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
1097+
repo.Insert(neworder);
10961098

10971099
var order = g.mysql.Select<Order>().Where(a => a.Id == neworder.Id).ToOne(); //查询订单表
10981100
if (order == null)

0 commit comments

Comments
 (0)