.net &引用;无法确定关联的主端…”;添加相同类型的多个实体时出错
我们有一个MVC4项目,最近对数据库模式进行了一些更改,这些更改可能与此问题有关。请原谅匈牙利符号 有几个相关的数据库表:.net &引用;无法确定关联的主端…”;添加相同类型的多个实体时出错,.net,sql-server,vb.net,entity-framework,.net,Sql Server,Vb.net,Entity Framework,我们有一个MVC4项目,最近对数据库模式进行了一些更改,这些更改可能与此问题有关。请原谅匈牙利符号 有几个相关的数据库表: mtblPersonRole是1:M,带有tblMemberBenefit,这是1:M,带有tblsourcededucation 现在,我创建了一个新的tblMemberBenefit实体,并将它们指向相同的mtblPersonRole实体。每个tblMemberBenefit可以有一个或多个tblsourcededucation实体作为子实体(ren) 如果我只添加一个
mtblPersonRole
是1:M,带有tblMemberBenefit
,这是1:M,带有tblsourcededucation
现在,我创建了一个新的tblMemberBenefit
实体,并将它们指向相同的mtblPersonRole
实体。每个tblMemberBenefit
可以有一个或多个tblsourcededucation
实体作为子实体(ren)
如果我只添加一个tblMemberBenefit
,那么一切都很好。但是,如果我添加了两个或更多,实体框架将阻塞并引发异常:
System.Data.UpdateException Unable to determine the principal end of the 'REIS_beModel.FK_tblSourceDeduction_tblMemberBenefit' relationship. Multiple added entities may have the same primary key. Void RegisterEntityReferentialConstraints(System.Data.IEntityStateEntry, Boolean) at System.Data.Mapping.Update.Internal.UpdateTranslator.RegisterEntityReferentialConstraints(IEntityStateEntry stateEntry, Boolean currentValues)
at System.Data.Mapping.Update.Internal.UpdateTranslator.RegisterReferentialConstraints(IEntityStateEntry stateEntry)
at System.Data.Mapping.Update.Internal.UpdateTranslator.PullModifiedEntriesFromStateManager()
at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands()
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
无论实际是否涉及任何tblsourcededucation
实体,这种情况都会发生,而且当我只添加一个tblMemberBenefit
时,这种情况永远不会发生。所有表都有一个32位整数的“Id”列和标识,因此我认为问题与此无关
如果在添加第二个tblMemberBenefit
之前在DbContext
上调用SaveChanges()
,则一切正常。但是,这不是一个可接受的解决方案,因为我需要在事务中完成所有这些工作,如果出现任何失败,则回滚所有内容
你知道我为什么会遇到这个异常,以及如何防止它发生吗?既然还没有人给出答案,我将发布我所做的似乎有效的事情:
首先,我创建了一个Enum
来表示每个tblMemberBenefit
实体的偏移量(它们通过BenefitType
属性是唯一的,这意味着我将只添加一个特定的福利类型)。然后,当我创建POCO时,对于给定类型的偏移量Enum
,我将Id列设置为负值。因此,第一个类型的Id可能为-1,而下一个类型的Id为-4
现在,当我调用SaveChanges()
时,一切正常,负Id列更改为SQL给定的标识值。尝试验证您的模型,很可能是存储模型和概念模型之间存在差异,或者它们之间存在映射。请显示用于添加实体的代码好吗?您是否使用Add
添加新实体和Attach
附加现有实体?该过程相当复杂,可能涉及10或12种不同的方法,具体取决于所做的工作。我使用Add
来添加新的实体,并且没有任何东西是Attach
ed(并且不需要这样做,因为所有事情都发生在同一个DbContext
实例中)。GetValidationErrors
返回0个错误。这里是它真正有趣的地方:如果我给任何一个POCO实体一个“假”Id值(在本例中我使用了-1),那么一切都正常。我想这家伙也有类似的问题…对不起,我没心思了((