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

时间:2015-08-20 21:46:31

标签: c# entity-framework

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

简而言之,我在尝试持久化对象的过程中遇到了无效的操作异常。我已将此跟踪回两个实体以及它们之间的关系。我的实际情况太技术化,没有任何意义,所以这是一个简单的域中的等效例子:

  

     
      
  • IdPerson [主键]
  •   
  • 名称
  •   
     

组织

     
      
  • IdOrganisation [主键]
  •   
  • IdCeo [foreign key =>人
  •   
  • IdCfo [foreign key =>人
  •   

因此,组织和人通过两个多对多或一个关系链接。

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

当我尝试ObjectSet.Attach()时,我遇到了异常,这个组织的首席执行官和首席财务官都是同一个人。似乎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)

如果首席执行官和首席财务官是不同的人,或者我删除了组织和个人之间的链接之一,则不会出现问题。

EF是否能够处理这种模式/关系? 如果是,我该如何解决异常?

1 个答案:

答案 0 :(得分:0)

向实体框架表明哪个外国关系是哪个

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; }