选项3:在外键上放置唯一约束或唯一索引。
外键的唯一性将该关系的基数限制为最多1。我测试并确认,在使用Sql Server和EF Core 5.0进行数据库优先场景时,这是正确的脚手架。
为什么选项3可能更可取
选项3适用于1到0..1和0..1到0..1关系。这意味着您可以在现有数据库上轻松使用它而无需更改它们。
当实体在链接之前可以独立存在时,0..1到0..1关系确实很自然。扩展上面的示例,如果我们允许系统用户帐户不与任何人相关联,并且我们还有尚未创建用户帐户的人,则可以通过0..1到0..1关系来最好地对其进行建模。
如果您确定需要1到0..1关系,则选项2仍然是一个很好的选择。您可以稍后迁移到选项3,但这将需要更多的工作。
附加说明
如果你正在实现一个 [0,1] 到 [0,1] 的关系,那么你的外键字段将是可空的。在可空外键上的唯一约束通常允许多行包含 NULL,因为 NULL 不是传统 SQL 中的值。然而,Sql Server 是一个例外,在外键中只允许一个行持有 NULL。CREATE UNIQUE INDEX IX_User_Person
ON User (PersonId) WHERE PersonId IS NOT NULL;
兄弟听我说。你是正确的。我也遇到了同样的问题。在一个列上同时使用主键和外键,不要将主键和外键分开成两个列。这肯定会解决你的问题。