EF6.1.1 代码优先 One-to-Zero/One 关系

EF6.1.1 Code First One-to-Zero/One Relationship

我正在尝试定义这些表。

_tbl1_
id      (PK)

_tbl2_
id      (PK)
tbl1_id (FK)

_tbl3_
id      (PK)
tbl1_id (FK)

...我可以从 Tbl1 导航到 Tbl2Tbl3

或从 Tbl2Tbl3 返回到 Tbl1.

虽然需要从 Tbl2Tbl3Tbl1 的关联,但记录在Tbl2Tbl3 可能不存在;所以 Tbl1 记录应该能够与我们的 Tbl2Tbl3.

这样设计是为了从Tbl1的角度与两个完全不同的实体建立可选关系。

class Tbl1
{
    [Key]
    public int Id { get; set; }
    public Tbl2 Tbl2 { get; set; }
    public Tbl2 Tbl3 { get; set; }
}

class Tbl2
{
    [Key]
    public int Id { get; set; }
    [ForeignKey("Tbl1")]
    public int Tbl1Id { get; set; }
    public Tbl1 Tbl1 { get; set; }
}

class Tbl3
{
    [Key]
    public int Id { get; set; }
    [ForeignKey("Tbl1")]
    public int Tbl1Id { get; set; }
    public Tbl1 Tbl1 { get; set; }
}

并且流利...

modelBuilder.Entity<Tbl2>()
    .HasRequired(e => e.Tbl1)
    .WithOptional(e => e.Tbl2);

modelBuilder.Entity<Tbl3>()
    .HasRequired(e => e.Tbl1)
    .WithOptional(e => e.Tbl3);

使用上面的方法我得到一个错误:

Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

这似乎意味着外键也必须是记录键。

那么,我可以这样做吗?可以吗?

我很乐意使用属性或流利 api 或两者兼而有之。

我认为您的 ForeignKey 属性需要引用一列并放置在导航上方 属性。例如:

[ForeignKey("Tbl1Id")]
public virtual Tbl1 tbl1 {get; set;}

即使您在 Tbl1 上定义导航 属性 到 Tbl2 和 Tbl3,外键注释也应该在从属 classes(tbl2 和 tbl3)中定义,而不是主体 class.

我不确定这是否能解决整个问题,但也许会有帮助。

祝你好运

就像其他类似问题一样;一对一或零可以通过对实体键使用相同的 属性 和从属实体上的主体实体的外键来实现。

我看不出另一种方式,并且由于在 SQL 中创建一对一或零将要求外键具有唯一性约束,因此最终结果几乎相同。