首页 > 解决方案 > 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 如何知道它是同一个实例。

标签: c#.netentity-framework-coreef-code-firstentity-relationship

解决方案


推荐阅读