【问题标题】:Entity being tracked despite AsNoTracking尽管有 AsNoTracking,实体仍被跟踪
【发布时间】:2020-01-17 04:54:16
【问题描述】:

我有一个对象 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 本身不会出现此错误吗?但错误似乎仅与导航属性有关。

感谢所有见解!

【问题讨论】:

  • map the Client param to the original - 显示执行此操作的代码。
  • 添加到代码中 - 我正在使用 automapper。
  • 如果你必须映射,为什么首先使用AsNoTracking()?这才是真正的问题。
  • 你能解释一下吗?真正的问题是什么?
  • 我使用 AsNoTracking 是因为 FindByCondition 并不总是用于编辑;它最常用于显示。

标签: linq entity-framework-core ef-core-2.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2019-04-10
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多