在 SQL Server 中实现一对零或一关系

Posted

技术标签:

【中文标题】在 SQL Server 中实现一对零或一关系【英文标题】:Implementing one-to-zero-or-one relation in SQL Server 【发布时间】:2011-11-30 10:40:03 【问题描述】:

我正在使用 Entity Framework 4.1 数据库优先方法。我使用过旧数据库。在我基于旧数据库中的表创建实体类的 edmx 文件中,某些实体之间存在 一对零或一 关联。

虽然我研究了数据库表和它们之间的关系,但我没有发现一对零或一关系是如何在数据库中实现的。

有关更多信息,我将我的数据库图的一些屏幕截图及其关系和对应实体的属性放在 edmx 文件中:

【问题讨论】:

【参考方案1】:

如果数据库表已经设计为具有 1:1 关系(或 1:0-1),那么 EF 可以很好地使用它,尽管它会使子表的名称复数(如果你让它复数) .

基本方法是创建一个外键(就好像你在建立一个 1:many 关系),然后在外键字段上放置一个唯一索引。这就是你的目标吗?

这也可能有帮助:Designing 1:1 and 1:m relationships in SQL Server。

另一方面,1-1 关系通常不是必需的和/或需要重新考虑的数据库设计的症状。但是,听起来你继承了设计......我知道这一切!

【讨论】:

【参考方案2】:

您的数据库中的 1-0..1 关系是直接可见的。它建立在 Course 和 OnlineCourse 表之间,其中 Course 是关系 (1) 的主体, OnlineCourse 依赖于在 CourseID 上配置的 FK。 FK 也是 OnlineCourse 的 PK = 它必须是唯一的,因此它是 0..1。

数据库“总是”使用 1 - 0..1,因为实数 1 - 1 不能有效地用于数据插入。 1 - 1 表示 left 必须插入 right 之后,而 right 必须插入 left 之后 = 不可能。因为 1 - 0..1 用于 left 是主要的,必须在 right 之前插入,而 right 是依赖的,必须在 left 之后插入。

【讨论】:

我在拥有子表ID的拥有表中添加了一个非空列,并添加了一个删除触发器以确保删除子表。这样我就可以确保拥有表正好有 1 个引用。

以上是关于在 SQL Server 中实现一对零或一关系的主要内容,如果未能解决你的问题,请参考以下文章

EF 代码优先 - 配置一对零或一关系,无需共享 PK/FK

使用 CodeFirst 的 C# 一对零或一关系

用于一对零或一关系的实体框架 (EF) 代码优先级联删除

实体代码第一个零或一到零或一关系

Fluent API 首先在 EF 代码中实现零或一到零或一的关系

关联映射级联操作关系维护 ---- Hibernate之一对多|多对一关系