如果实体的子集合处于分离状态时如何更新?我在Groups
和Users
之间存在多对多关系。当用户编辑组时,在回发后,我会获得要添加到组中或从组中删除的用户ID列表。问题是当分离viewModel.Group
时,在重新附加和保存实体时,不会反映对子集合的更改。这是代码......
if (ModelState.IsValid)
{
if (viewModel.SelectedUserIDs != null)
{
foreach (var id in viewModel.SelectedUserIDs)
{
var user = _userRepo.GetUser(id);
viewModel.Group.Users.Add(user);
}
}
_groupRepo.SaveGroup(viewModel.Group);
}
SaveGroup方法
if (group.GroupID <= 0)
{
Context.Groups.Add(group);
}
else if (Context.Entry(group).State == System.Data.Entity.EntityState.Detached)
{
Context.Groups.Attach(group);
Context.Entry(group).State = System.Data.Entity.EntityState.Modified;
}
Context.SaveChangesAsync();
我尝试过的两件事就是立即重新附加实体并进行更改
if (ModelState.IsValid)
{
_groupRepo.Attach(viewModel.Group);
if (viewModel.SelectedUserIDs != null)
{
...
但同样的问题也会发生。保存实体后,子集合将恢复为原始状态。
我找到的唯一解决方法是获取一个新实体并修改新实体的集合,该集合将按预期保留更改,但使用这种方式迫使我将属性更改从viewModel.Group
复制到freshGroup
if (ModelState.IsValid)
{
var freshGroup = _groupRepo.GetGroup(viewModel.Group.GroupID);
if (viewModel.SelectedUserIDs != null)
{
//make child collection changes to 'freshGroup'
//copy properties from 'viewModel.Group' to 'freshGroup'
...
答案 0 :(得分:0)
您必须手动设置每个项目的实体状态:
dbContext.Entry(entity).State = EntityState.Modified;
您还需要在子实体上执行此操作。