sql - 如何在 SQL Server 中创建真正的一对一关系

标签 sql sql-server entity-framework one-to-one

我有两张 table CountryCapital ,我设置Capital的主键作为引用 Country 的外键的初级。但是当我使用 Entity Framework 数据库优先时,模型是1到0..1。

如何在 SQL Server 中创建一对一关系?

enter image description here

最佳答案

我很确定在 SQL Server 中实现真正的一对一关系在技术上是不可能的,因为这意味着您必须同时插入两条记录(否则您' d 在插入时出现约束错误),在两个表中,两个表都彼此具有外键关系。

话虽如此,用外键描述的数据库设计是 1 到 0..1 的关系。不存在需要 tableB 中的记录的约束。您可以与在 tableB 中创建记录的触发器建立伪关系。

所以有一些伪解决方案

首先,将所有数据存储在一个表中。那么您在 EF 中就不会遇到任何问题。

或者其次,您的实体必须足够聪明,除非有关联的记录,否则不允许插入。

或者第三种,也是最有可能的,you have a problem you are trying to solve, and you are asking us why your solution doesn't work instead of the actual problem you are trying to solve (an XY Problem) .

更新

为了在现实中解释一对一关系如何行不通,我将使用 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/

相关文章:

sql - 比较字符串中随机放置的信息?

c# - 使用 ASP.NET Web 应用程序更改默认数据库

.net - EF : Can I have single point for lambda to class instance conversion?

c# - Entity Framework 是否经过编程,因此当您有许多实体类型时速度很慢?

sql - 如何在函数中使用用户定义的表类型进行返回?

sql - 临时数据库如何工作?

sql - 使用 SQL Server 创建 XML

.net - EntityFramework 集合属性是否需要 setter

SQL表设计建议

mysql - SQL join 只匹配最大值