我有一个对象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实例已被跟踪。几个问题:
感谢所有见解!
答案 0 :(得分:0)
如果其他人遇到此问题:自动映射器在映射集合时,显然会重新创建整个集合。我通过在映射配置中使用Automapper.Collections解决了上述问题。感谢Mat J的提示!