实体框架4.0和自引用表;. savechanges()在. addobject()上失败

本文关键字:addobject 失败 savechanges 框架 自引用 实体 | 更新日期: 2023-09-27 17:50:10

问题总结:

当使用自引用关系并尝试添加对象时,. savechanges()以"无法确定PlannerModel的原则结束"失败。FK_PlanItem_PlanItem"关系。多个添加的实体可以有相同的主键" .

问题细节:

plannerContext = new PlannerEntities2();
var unitPlanQuery = from d in plannerContext.UnitPlans 
                    where d.TeacherId == sourceTeacherId
                    orderby d.TeacherId
                    select d;
var planItem = new PlanItem();
ClonePlanItem(pi, planItem); // where pi is original PlanItem
planItem.ParentPlanItem = (PlanItem)planItemsAddedHT[pi.ParentPlanItemId];
// above object on right is the previously added PlanItem
plannerContext.PlanItems.AddObject(planItem);
plannerContext.SaveChanges();

我回到我的代码并注释它,这样我就可以肯定地知道只有一个调用' plannerContect.PlanItems.AddObject(planItem) '正在发生。这样就只需要插入一个对象。错误信息变为:

"无法确定相关操作的有效顺序。"依赖关系可能由于外键约束、模型需求或存储生成的值而存在。

我回去并添加了"允许null"的ParentPlanItemId列在SQL管理工作室(SQL Server 2008 btw),并刷新了我的模型…但这并没有什么不同。

表:PlanItem


PlanItem int PK,标识

ParentPlanItemID int,允许null

ItemText varchar (200)

来自模型设计者的参考约束:Principal = PlanItem;主键= PlanItemId;依赖属性= ParentPlanItemId

关联模型设计器:

AssociationSet Name: FK_PlanItem_PlanItem

End1 multiple: 1(One Of PlanItem)

导航道具:PlanItem1

End2 multiicity: * (Collection of PlanItem)

End2 Nav: ParentPlanItem

名称:FK_PlanItem_PlanItem

实体框架4.0和自引用表;. savechanges()在. addobject()上失败

是否尝试过直接设置

planItem.ParentPlanItemReference

财产吗?

您实际上将其设置为已经存在于DB中的特定计划项标识符(我理解您之前已经拥有)。我并不是说它会成功,但值得一试。我已经多次使用这些*Reference属性来加快插入和读取的过程。

事实证明,像我那样设置父属性并不是问题。对于这样的自引用表,多重性需要为(0或1),并且ParentPlanItemId的属性需要允许为空。

为大家干杯!