我正在与一个实体框架问题作斗争,完全超出我的深度。
简而言之,我在尝试持久化对象的过程中遇到了无效的操作异常。我已将此跟踪回两个实体以及它们之间的关系。我的实际情况太技术化,没有任何意义,所以这是一个简单的域中的等效例子:
人
- 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是否能够处理这种模式/关系? 如果是,我该如何解决异常?
答案 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; }