【问题标题】:Establishing One-to-One Relationship in Entity Framework在实体框架中建立一对一的关系
【发布时间】:2015-03-17 01:32:04
【问题描述】:

在数据库级别处理一对一关系时,我们(我?)通常最终会实现实际上是一对多的关系。

例如:

CREATE TABLE master (masterId INT PRIMARY KEY)

CREATE TABLE child (
    childId INT PRIMARY KEY,
    masterId INT,
    CONSTRAINT child_master_fk FOREIGN KEY (masterId) REFERENCES master (masterId))

虽然单个child 只能引用单个master,但没有什么可以阻止多个childs 引用相同的master,从而形成一对多关系。

从这样的数据库设置生成实体数据模型时,这反映在主实体将包含对子实体的引用,但子实体将具有主实体集合。

由于我在逻辑上将关系视为一对一,所以我从不期望孩子的主集合包含多个元素;因此,我希望子实体有一个主引用而不是一个集合。

实现此目的的正确方法是什么?在数据库级别创建双向外键约束?调整生成的模型?

【问题讨论】:

    标签: entity-framework database-design one-to-one


    【解决方案1】:

    调整模型。添加一个返回单个实例的单一引用属性并忽略集合属性。然后在映射配置中设置 EF 忽略的奇异属性。

    这不是我所说的优雅,但是在将 EF 与预先存在的数据库一起使用时,通常必须做出这样的牺牲。

    【讨论】:

    • 这能让我从主人导航到孩子吗?
    • 是的,有点。如果您的 Master 实体具有生成的 Children 集合属性,则可以将另一个属性手动编码到 Master 上并告诉 EF 忽略它。假设手动编码的属性被命名为 OnlyChild,那么您可以使用 Master.OnlyChild 来引用它。这里最大的警告是没有什么可以阻止您或其他人直接使用 Children 属性添加多个孩子。忍受不得不打电话给Children.FirstOrDefault() 来访问孩子的小烦恼可能会更好。
    • 不,EF 完全不知道Master.OnlyChild。该属性的 getter 需要使用 Children.FirstOrDefault()Children.SingleOrDefault()Master.Children 集合中检索一个条目,具体取决于您是否希望它在以某种方式添加额外的孩子时抛出异常。属性的 setter 会检查 Master.Children 是否已经有一个条目(如果有多个条目,可能会抛出异常)删除该条目并添加新条目。
    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多