【问题标题】:Implementing identifying relationships with EF4使用 EF4 实现识别关系
【发布时间】:2013-06-28 12:38:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: visual-studio-2010 entity-framework-4


    【解决方案1】:

    我终于明白了:

    转到您的子实体并创建一个标量属性 ParentId。将此属性设置为实体键(使其成为主键,以及您的子实体的 Id 属性)。接下来转到您的 ParentChild 关系并添加引用约束。约束的 Principal 是您的 Parent,Dependent 是您的 Child。从属属性必须是您刚刚在您的孩子上创建的属性(即 ParentId)。保存所有内容,您就可以开始了。

    基本上这在这篇博文中被描述为“场景 2”:http://mocella.blogspot.com/2010/01/entity-framework-v4-object-graph.html

    【讨论】:

    • 我这样做,然后得到错误 3002“映射片段中的问题”,因为实体模型中的主键不再反映数据库中的主键。我不得不从主键中删除ParentId,(并且还删除了关系的映射,因为这与引用约束冲突)
    • 我的解决方案是模型优先,因此它假设您从模型生成数据库。我不知道它如何应用于现有数据库。您的解决方案是否仍保留识别关系的属性?
    • 好吧,看起来确实如此 :) 我可以通过简单地执行 parent.Remove(child) 来删除,当我 SaveChanges 时它不会抱怨...
    • 您是否检查过该孩子实际上已从数据库中删除?也许您只是与父端的0..1 而不是1 有关系?
    • 不,它在父端是 1,而且数据库中的 parentId 不是 NULL,所以会骂我。
    【解决方案2】:

    不,你在正确的道路上。您需要在 EDM 设计器中创建 2 个实体(父实体和子实体)后,右键单击父实体并选择添加 => 关联...,然后指定多重性和导航属性名称,然后单击确定。您将看到 VS 在两者之间创建关联,稍后当您从模型生成数据库时,这将导致这两个表之间的关系。
    不要在您的子实体上创建类似 ParentID 的属性,因为一旦您创建关联,设计器就会自动创建它。
    此外,您可以在 EDM 设计器中右键单击关联并选择属性并在“End2 OnDelete”选项上选择“Cascade”,以便在删除父项时删除子项。

    【讨论】:

    • 只有在我删除父对象时才有效。我不能删除孩子(没有对象上下文),也不能删除父母(仍然需要)。我所能做的就是删除关系,当我这样做时,它不会删除孩子。删除时的级联仅在我实际删除父对象时才有效;当我删除关系时,它不会删除孩子。使用您的解决方案会给我一条错误消息:“来自 'ParentChild' AssociationSet 的关系处于 'Deleted' 状态。鉴于多重约束,相应的 'Child' 也必须处于 'Deleted' 状态。”
    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 2012-04-02
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多