实体框架:ObjectSet attach(),具有多个关系的实体

本文关键字:实体 关系 框架 ObjectSet attach | 更新日期: 2023-09-27 18:08:55

我正在与实体框架问题作斗争,完全超出了我的深度。

简而言之,我在尝试持久化对象的过程中遇到了一个无效的操作异常。我将其追溯到两个实体以及它们之间的关系。我的实际上下文太技术性了,没有任何意义,所以这是一个简单领域的等效示例:

  • IdPerson[主键]
  • <
  • 名称/gh>
组织

  • IdOrganisation[主键]
  • IdCeo[外键=> person]
  • IdCfo[外键=> person]

所以,组织和人是由两个多到零或一的关系连接起来的。

  • 一个组织可以没有或只有一个人担任首席执行官。
  • 一个组织可以没有或只有一个人担任首席财务官。
  • 一个人可以担任零个或多个组织的首席执行官和/或首席财务官。

当我尝试ObjectSet.Attach()一个由同一个人同时担任CEO和CFO的组织时,我遇到了异常。EF似乎试图(并且失败了)附加第二个人。

System.InvalidOperationException: An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
at System.Data.Objects.ObjectContext.AttachSingleObject(IEntityWrapper wrappedEntity, EntitySet entitySet, String argumentName)
at System.Data.Objects.DataClasses.RelatedEnd.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, Boolean relationshipAlreadyExists, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.EntityReference`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.WalkObjectGraphToIncludeAllRelatedEntities(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, Boolean relationshipAlreadyExists, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.EntityReference`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(Boolean doAttach)
at System.Data.Objects.ObjectContext.AttachTo(String entitySetName, Object entity)
at System.Data.Objects.ObjectSet`1.Attach(TEntity entity)

如果CEO和CFO是不同的人,或者如果我删除组织和个人之间的一个链接,则不会出现问题。

EF是否能够处理这个模型/关系?是,如何解决异常?

实体框架:ObjectSet attach(),具有多个关系的实体

指示实体框架哪个外部关系是哪个

Organisation
//CEO
public int IdCeo { get; set; }
[ForeignKey("IdCeo")]
public virtual Person CEO { get; set; }

//CFO
public int IdCfo { get; set; }
[ForeignKey("IdCfo")]
public virtual Person CFO { get; set; }