【问题标题】:Updating detached entities with modified child entities使用修改后的子实体更新分离的实体
【发布时间】:2014-02-12 17:04:27
【问题描述】:

当实体的子集合处于分离状态时,如何更新它们?我在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);
}

保存组方法

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'
    ...

【问题讨论】:

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


    【解决方案1】:

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

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

    您也需要对子实体执行此操作。

    【讨论】:

      猜你喜欢
      • 2017-10-11
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多