我有两张 table Country
和Capital
,我设置Capital
的主键作为引用 Country
的外键的初级。但是当我使用 Entity Framework 数据库优先时,模型是1到0..1。
如何在 SQL Server 中创建一对一关系?
最佳答案
我很确定在 SQL Server 中实现真正的一对一关系在技术上是不可能的,因为这意味着您必须同时插入两条记录(否则您' d 在插入时出现约束错误),在两个表中,两个表都彼此具有外键关系。
话虽如此,用外键描述的数据库设计是 1 到 0..1 的关系。不存在需要 tableB 中的记录的约束。您可以与在 tableB 中创建记录的触发器建立伪关系。
所以有一些伪解决方案
首先,将所有数据存储在一个表中。那么您在 EF 中就不会遇到任何问题。
或者其次,您的实体必须足够聪明,除非有关联的记录,否则不允许插入。
更新
为了在现实中解释一对一关系如何行不通,我将使用 Chicken or the egg dilemma 进行类比。 。我不打算解决这个困境,但如果你有一个约束,即为了将鸡蛋添加到鸡蛋表中,鸡的关系必须存在,并且鸡必须存在于表中,那么您无法将鸡蛋添加到鸡蛋表中。反之亦然。如果 Egg 表中不存在与 Egg 和 Egg 的关系,则无法将 Chicken 添加到 Chicken 表中。因此,在不违反任何规则/约束的情况下,不可能在数据库中创建任何记录。
一对一关系的数据库命名法具有误导性。我见过的所有关系(因此是我的经验)都将更具有描述性,是一对(零或一)关系。
更新 EF 5.0 - 一对一支持
虽然 SQL Server 仍允许从属行为空。 Entity Framework Core 5.0 现在允许您根据需要配置依赖属性。 EF 5 What's new
摘录:
In EF Core 5.0, a navigation to an owned entity can be configured as a required dependent. For example:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>(b =>
{
b.OwnsOne(e => e.HomeAddress,
b =>
{
b.Property(e => e.City).IsRequired();
b.Property(e => e.Postcode).IsRequired();
});
b.Navigation(e => e.HomeAddress).IsRequired();
});
}
关于sql - 如何在 SQL Server 中创建真正的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10292355/