尽管有AsNoTracking,但仍在跟踪实体

时间:2019-09-16 10:57:22

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

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

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本身是否会出现此错误?但是错误似乎仅在于导航属性。

感谢所有见解!

1 个答案:

答案 0 :(得分:0)

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