Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net &引用;无法确定关联的主端…”;添加相同类型的多个实体时出错_.net_Sql Server_Vb.net_Entity Framework - Fatal编程技术网

.net &引用;无法确定关联的主端…”;添加相同类型的多个实体时出错

.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) 如果我只添加一个

我们有一个MVC4项目,最近对数据库模式进行了一些更改,这些更改可能与此问题有关。请原谅匈牙利符号

有几个相关的数据库表:

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),那么一切都正常。我想这家伙也有类似的问题…对不起,我没心思了((