【发布时间】: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 实例已被跟踪。有几个问题:
- 为了显示目的而检索客户和子订单时,我使用 AsNoTracking。
- 我在没有 AsNoTracking 的情况下检索的唯一地方是我在这个方法中获取原件的地方。
- 该错误与父属性无关。如果我在其他地方不正确地检索客户端,客户端 ID 本身不会出现此错误吗?但错误似乎仅与导航属性有关。
感谢所有见解!
【问题讨论】:
-
map the Client param to the original- 显示执行此操作的代码。 -
添加到代码中 - 我正在使用 automapper。
-
如果你必须映射,为什么首先使用
AsNoTracking()?这才是真正的问题。 -
你能解释一下吗?真正的问题是什么?
-
我使用 AsNoTracking 是因为 FindByCondition 并不总是用于编辑;它最常用于显示。
标签: linq entity-framework-core ef-core-2.0