c# - EF Core:跟踪/身份解析 - 哪些操作会破坏它?
问题描述
我从数据库中获取子实体列表,然后在不修改实体的情况下,使用户能够将它们分配给新创建的父实体(一对多或多对多关系)。问题是同一个实体可以多次分配给许多不同的父母,因此这对我来说非常重要,以保持身份解析在ChangeTracker
.
要分配的实体是这样获取的(这是一个示例):
var entities = await DbContext.Entities.AsNoTrackingWithIdentityResolution().ToListAsync();
或者完整的图形从本地存储反序列化并保留引用,如本例所示:https ://docs.microsoft.com/pl-pl/ef/core/change-tracking/identity-resolution#preserve-references
但是,在我的代码中的某处,我进行了一项操作,使 EF Core 失去了身份解析,并且在我想添加新创建的图形之后,我得到以下异常:
保存更改时出错。错误详细信息:无法跟踪实体类型“Entity”的实例,因为已经在跟踪具有相同键值 {'Id'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。
我试图手动解决重复项TrackGraph
:
DbContext.ChangeTracker.TrackGraph(
entity, node => {
var keyValue = node.Entry.Property("Id").CurrentValue;
var entityType = node.Entry.Metadata;
var existingEntity = node.Entry.DbContext.ChangeTracker.Entries()
.FirstOrDefault(
e => Equals(e.Metadata, entityType) &&
Equals(e.Property("Id").CurrentValue, keyValue));
if (existingEntity == null)
node.Entry.State = EntityState.Unchanged;
//attaching an entity to the graph if not yet attached, but none of its properties should be updated
});
但它只在第一个找到的 an 实例Entity
和它的父级之间创建关系,所有进一步的关系Entity
都被省略了。
到目前为止,我了解到像这样的作业会破坏整个跟踪:
var entity = await DbContext.Entities.FirstOrDefault().AsNoTrackingWithIdentityResolution();
//further in the code
entity = entity2; //or new Entity();
但是如何让它在整个列表中工作,特别是如果我想对它进行一些修改,例如过滤、强制转换?哪些操作会破坏它?目前我很难理解 EF Core 如何知道它是同一个实例。
解决方案
推荐阅读
- locust - 分布式工作进程产生的负载不等同于单个进程产生的负载
- c - C 创建并运行windows服务
- gis - Kepler.gl - 当我在本地运行 Dropbox 进行开发时出现问题
- go - switch case 中的 break 语句在无限循环中无效
- mongodb-query - MongoDB Aggregate $min 不计算
- google-apps-script - 用户通过 google 网络应用程序进行身份验证后获取和使用访问令牌
- javascript - 云功能(GCP)要求登录以接收请求
- php - MYSQL BIT 列返回意外结果(┌)
- html - 当自动完成隐藏在滚动区域中时,Angular Material 自动完成面板不会隐藏
- inno-setup - Inno 设置中的 BrowseForFolder 函数不显示映射的驱动器