EF6中主键和唯一键之间的一对一关系

时间:2016-10-16 13:18:31

标签: entity-framework ef-migrations

我尝试使用主键和两个表的唯一键(而不是主键)在两个表之间创建一对一关系。

以下是我想要工作的内容。

// The principal end
public class A
{
    // The primary Key
    public int AId { get; set; }

    // The navigation property
    public virtual B B { get; set; }
}

// The dependent end
public class B
{
    // The primary Key
    public int BId { get; set; }

    // The unique key
    [Index(IsUnique = true)]
    public int AId { get; set; }

    // The navigation property
    public virtual A A { get; set; }
}

但后来我看到了这个错误:

  

无法确定类型之间关联的主要结尾' A'和' B'。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

我非常确定SQL Server中允许使用primarykey-uniquekey关系。看起来EF6并不支持它。似乎EF Core 1.0,但现在移植到EF Core是不可行的。

为什么我们需要这种关系:
我们在生产中有两个表AB,但应该存在的一对一关系缺失。这种关系是我们需要的,因此我们可以使用EF从A对象导航B对象。由于两个表都有值,我们无法真正制作主键,即外键 - 我们最终会得到不正确的数据。

我解决这个问题的方法是:

  1. 添加一列
  2. 使用正确的A ids
  3. 填充它
  4. 让它独一无二
  5. 建立1-1关系
  6. 另一种解决方法是非常受欢迎。

1 个答案:

答案 0 :(得分:0)

这可以通过使用 Fluent API 的 .HasPrincipalKey() 方法的 EF Core 实现。不幸的是,EF6 不支持,这是一种耻辱,因为对唯一键的关系本质上可以与外键约束一样对待,所以我想它会很容易添加。

既然 MS 已经忘记了 EF6,而是专注于 EF Core,这将永远不会发生。我真的很喜欢使用视觉实体设计器,因为它节省了很多时间。看着 EF Core DbContext 脚手架生成器为我吐出的一千多行代码,至少可以说是令人沮丧的。当然,当你处理一个由两个可爱的桌子组成的演示项目时,这很不错,但我们都知道在现实世界中情况并非如此。使用 ORM 的全部目的是节省时间,但我不确定必须管理数千行配置代码是否更好。只需两美分。