linq - 尽管有 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 实例已经被跟踪。有几个问题:
- 无论出于显示目的而检索客户和子订单,我都使用 AsNoTracking。
- 我在没有 AsNoTracking 的情况下检索的唯一地方是我在这种方法中获得原始文件的地方。
- 该错误与父属性无关。如果我在其他地方不正确地检索客户端,客户端 ID 本身不会出现此错误吗?但错误似乎只与导航属性有关。
感谢所有见解!
解决方案
如果其他人遇到这种情况:Automapper,在映射集合时,显然会重新创建整个集合。我通过在映射配置中使用 Automapper.Collections 解决了上述问题。感谢 Mat J 的提示!
推荐阅读
- powershell - 在 PowerShell 中一起使用 ffmpeg 和 ffplay
- c# - 具有多个接口的单元测试
- ios - CDYelpFusionKit 初始化错误
- selenium - 试图将鼠标悬停在菜单上并单击子菜单中的链接,但没有运气
- kdb - 在功能修正中重载运算符
- android - 在 Firebase Firestore (Android) 中删除多个文档
- asp.net - CustomErrors mode="On" 不会重定向到 ASP.Net Web API 2.0 中的自定义错误页面
- java - Android测验应用程序在检查用户答案时崩溃
- python - 使用 python 解析 cpp 文件以查找拥有 start "{" 和 end "}" 的函数
- macros - Scheme宏什么匹配什么?