Entity Framework 4.0和自引用表; .SaveChanges()失败.AddObject()

时间:2011-04-14 23:00:50

标签: c# tsql entity-framework-4

问题摘要:

当使用自引用关系并尝试添加对象时,.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)'正在进行中。因此,只有一个对象可以插入。错误消息更改为:

“无法确定相关操作的有效排序。由于外键约束,模型要求或存储生成的值,可能存在依赖关系。“

我回去并在SQL Management Studio(SQL Server 2008 btw)的ParentPlanItemId列中添加了“Allow Nulls”,并刷新了我的模型......但这并没有什么区别。

表:PlanItem


PlanItem int PK,identity

ParentPlanItemID int,allow null

ItemText varchar(200)

模型设计器的参照约束:Principal = PlanItem; Principal Key = PlanItemId; Dependent Property = ParentPlanItemId

模型设计师的关联:

AssociationSet名称:FK_PlanItem_PlanItem

End1 Multipllicity:1(PlanItem之一)

End1导航道具:PlanItem1

End2 Multuplicity:*(PlanItem的集合)

End2 Nav:ParentPlanItem

名称:FK_PlanItem_PlanItem

2 个答案:

答案 0 :(得分:0)

您是否尝试过直接设置

planItem.ParentPlanItemReference

属性?

您实际上会将其设置为数据库中已存在的特定计划项目标识符(您之前已经拥有的标识符)。我不是说它会起作用,但值得一试。我已多次使用这些*Reference属性来加速插入过程,有时还可以读取。

检查this blog post以获取进一步的参考。

答案 1 :(得分:0)

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

为所有人欢呼!