- 修复 DbContext/Repository SaveMany 一对多保存时删除条件 bug;

This commit is contained in:
28810 2020-03-06 00:15:35 +08:00
parent fa3aa8ec83
commit b45360bfbe
3 changed files with 35 additions and 3 deletions

View File

@ -158,10 +158,25 @@ namespace FreeSql
if (tref.RefType == Internal.Model.TableRefType.OneToMany) if (tref.RefType == Internal.Model.TableRefType.OneToMany)
{ {
await DbContextExecCommandAsync(); 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; var propValEach = GetItemValue(item, prop) as IEnumerable;
await _db.Orm.Delete<object>().AsType(tref.RefEntityType) await _db.Orm.Delete<object>().AsType(tref.RefEntityType)
.WithTransaction(_uow?.GetOrBeginTransaction()) .WithTransaction(_uow?.GetOrBeginTransaction())
.Where(Expression.Lambda<Func<object, bool>>(whereParentExp, deleteWhereParentParam))
.WhereDynamic(propValEach, true).ExecuteAffrowsAsync(); .WhereDynamic(propValEach, true).ExecuteAffrowsAsync();
} }
} }

View File

@ -170,10 +170,25 @@ namespace FreeSql
if (tref.RefType == Internal.Model.TableRefType.OneToMany) if (tref.RefType == Internal.Model.TableRefType.OneToMany)
{ {
DbContextExecCommand(); 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; var propValEach = GetItemValue(item, prop) as IEnumerable;
_db.Orm.Delete<object>().AsType(tref.RefEntityType) _db.Orm.Delete<object>().AsType(tref.RefEntityType)
.WithTransaction(_uow?.GetOrBeginTransaction()) .WithTransaction(_uow?.GetOrBeginTransaction())
.Where(Expression.Lambda<Func<object, bool>>(whereParentExp, deleteWhereParentParam))
.WhereDynamic(propValEach, true).ExecuteAffrows(); .WhereDynamic(propValEach, true).ExecuteAffrows();
} }
} }

View File

@ -1092,7 +1092,9 @@ namespace FreeSql.Tests
}) })
}; };
g.mysql.GetRepository<Order>().Insert(neworder); var repo = g.mysql.GetRepository<Order>();
repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
repo.Insert(neworder);
var order = g.mysql.Select<Order>().Where(a => a.Id == neworder.Id).ToOne(); //查询订单表 var order = g.mysql.Select<Order>().Where(a => a.Id == neworder.Id).ToOne(); //查询订单表
if (order == null) if (order == null)