首页 > 解决方案 > 尽管有 AsNoTracking,实体仍被跟踪

问题描述

我有一个对象 Client,它的导航属性是 Order 对象的列表。每当我检索客户对象时,我都会使用 AsNoTracking() 包含订单列表。

public new IQueryable<Client> FindByConditionNoTracking(Expression<Func<Client, bool>> expression)
{
    return this.ClientContext.Set<Client>().Include(s => s.Orders)
               .Where(expression).AsNoTracking();
}

在我的 UpdateClient 存储库方法中,我接受了一个 Client 对象。然后,我尝试从数据库中检索该原始客户端(使用 Include 获取子订单),将 Client 参数映射到原始客户端,然后保存到数据库中。在这里,我不使用 AsNoTracking,因为我特别希望跟踪更改。

public new void Update(Client client)
    {

        var id = client.ClientId;
        var original = this.ClientContext.Clients.Include(s => s.Orders).Where(s => s.ClientId == id)
                        .FirstOrDefault<Client>();
        original = _mapper.Map(client, original);
        this.ClientContext.Update(original);
    }

我得到的错误是具有相同键值的 Order 实例已经被跟踪。有几个问题:

  1. 无论出于显示目的而检索客户和子订单,我都使用 AsNoTracking。
  2. 我在没有 AsNoTracking 的情况下检索的唯一地方是我在这种方法中获得原始文件的地方。
  3. 该错误与父属性无关。如果我在其他地方不正确地检索客户端,客户端 ID 本身不会出现此错误吗?但错误似乎只与导航属性有关。

感谢所有见解!

标签: linqentity-framework-coreef-core-2.0

解决方案


如果其他人遇到这种情况:Automapper,在映射集合时,显然会重新创建整个集合。我通过在映射配置中使用 Automapper.Collections 解决了上述问题。感谢 Mat J 的提示!


推荐阅读