2010-09-14 68 views
2

我目前处于需要删除实体而无法访问关联ObjectContext的情况。我读了关于识别关系的信息,他们似乎正是我需要的:我想删除一个对象,一旦它不再被它的“父对象”引用。实施与EF4的识别关系

我正在使用Visual Studio 2010 Premium从edmx文件生成我的数据库。据我所知,我需要在我的“子”对象表的主键中包含我的“父”对象的外键。但是,我找不到一种方法告诉Visual Studio执行此操作。

有人能帮我解决这个问题吗?我完全走错路了,还是只是在某个地方错过了一个设置?

回答

2

我终于想通了:

转到您的孩子的实体,并创建一个标量属性的ParentId。将此属性设置为实体键(使其成为主键,以及您的Child实体的Id属性)。接下来转到您的ParentChild关系并添加参考约束。约束的原则是你的父母和亲属是你的孩子。从属财产必须是您刚刚在您的孩子上创建的财产(即ParentId)。保存一切,你很好去。

基本上,这是在这个博客中描述为“方案2”:http://mocella.blogspot.com/2010/01/entity-framework-v4-object-graph.html

+0

我这样做,然后得到错误3002“映射片段中的问题”,因为实体模型中的主键不再反映DB中的主键。我必须从主键中删除'ParentId'(并删除关系的映射,因为它与参考约束冲突) – Benjol 2013-09-11 08:22:59

+0

我的解决方案首先是针对模型的,因此它假定您从模型生成数据库。我不知道它如何适用于现有的数据库。您的解决方案是否仍保留识别关系的属性? – Chris 2013-09-12 00:26:37

+0

好吧,它看起来像它:)我可以删除通过简单地做一个'parent.Remove(子)',它不会抱怨当我'SaveChanges' ... – Benjol 2013-09-12 04:35:49

0

不,你是在正确的道路上。你需要做的是在EDM设计器中创建你的2个实体(Parent and Child)后,右键单击父实体并选择Add => Association ...,然后指定Multiplicity和Navigation属性名称,然后单击Ok。你会看到VS之间创建了一个关联关系,当你从模型生成一个数据库时,这将导致这两个表之间的关系。
不是在你的Child实体上创建一个像ParentID一样的属性,因为一旦你创建了关联,设计器会自动创建它。
此外,您可以右键单击EDM设计器中的关联并选择属性,然后在“End2 OnDelete”选项上选择“Cascade”选项,以便删除父项时子项将被删除。

+0

,只有当我删除父对象的工作。我无法删除子项(没有对象上下文),我不能删除父项(仍然需要)。我所能做的就是消除关系,当我这样做时,它不会删除孩子。级联删除仅适用于实际删除父对象;当我删除关系时,它不会删除孩子。使用你的解决方案给了我一个错误信息:“来自'ParentChild'AssociationSet的关系处于'Deleted'状态。给定多重约束,相应的'Child'也必须处于'Deleted'状态。 – Chris 2010-09-15 07:06:52