使用已修改的子实体更新分离的实体

时间:2014-02-12 17:04:28

标签: c# entity-framework asp.net-mvc-5 entity-framework-6

如果实体的子集合处于分离状态时如何更新?我在GroupsUsers之间存在多对多关系。当用户编辑组时,在回发后,我会获得要添加到组中或从组中删除的用户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'
    ...

1 个答案:

答案 0 :(得分:0)

您必须手动设置每个项目的实体状态:

dbContext.Entry(entity).State = EntityState.Modified;

您还需要在子实体上执行此操作。