实体框架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)
导航道具:PlanItem1End2 multiicity: * (Collection of PlanItem)
End2 Nav: ParentPlanItem
名称:FK_PlanItem_PlanItem
是否尝试过直接设置
planItem.ParentPlanItemReference
财产吗?
您实际上将其设置为已经存在于DB中的特定计划项标识符(我理解您之前已经拥有)。我并不是说它会成功,但值得一试。我已经多次使用这些*Reference
属性来加快插入和读取的过程。
事实证明,像我那样设置父属性并不是问题。对于这样的自引用表,多重性需要为(0或1),并且ParentPlanItemId的属性需要允许为空。
为大家干杯!