mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 修复 DbContext/Repository SaveMany 一对多保存时删除条件 bug;
This commit is contained in:
parent
fa3aa8ec83
commit
b45360bfbe
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user