实体框架更新无跟踪实体

7
我该如何更新通过 AsNoTracking() 方法分离出来的实体?
var _agency = agencyRepository.Get(filter: a => a.Id == agency.Id)
                              .AsQueryable()
                              .AsNoTracking()
                              .FirstOrDefault(); 
agencyRepository.Update(_agency);

而且我的更新方法已经设置了修改:

public virtual void Update(T entity)
    {            
        dbset.Attach(entity);
        dataContext.Entry(entity).State = System.Data.Entity.EntityState.Modified;
    }

我能找到由DataContext关联的先前实体吗?或者有什么建议可以防止对我的用户实体进行跟踪(tracking)?


你正在改变什么,实际结果是什么? - haim770
事实上,我在Update()时遇到了“附加类型为'Project.Domain.Entities.Agency'的实体失败,因为另一个具有相同主键值的实体已经存在”的错误,所以我尝试分离实体来解决问题,但现在更新没有任何作用。 - Azarsa
你尝试过不调用“Attach”吗? - haim770
1
有什么更改?此外,您是否正在调用“SaveChanges()”? - haim770
你要改变什么? - haim770
显示剩余7条评论
2个回答

10

你可以更改实体的状态:

ctx.Entry(_agency).State = System.Data.Entity.EntityState.Modified;
ctx.SaveChanges();

阅读更多 这篇 或者 这篇 文章。


这对我来说并没有解决问题。我仍然收到错误消息:“由于使用了NoTracking合并选项检索,因此无法自动将角色添加到上下文中。” - toddmillernyc

1
当你以"AsNoTracking"获取对象时,这意味着它已从上下文中分离出来,更改将不被跟踪。你所需要做的就是重新将其附加到上下文中。
以下是示例代码:
async Task update_entity() {
  ctx.Attach(profile);
  profile.image_id = "12345667";
  await ctx.SaveChangesAsync();
}

如果我运行这段代码两次会怎样?如果我尝试附加已经附加的实体会怎样? - Vitaly Leskiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接