我正在尝试定义这些表。

_tbl1_
id      (PK)

_tbl2_
id      (PK)
tbl1_id (FK)

_tbl3_
id      (PK)
tbl1_id (FK)


...我可以从Tbl1导航到Tbl2或Tbl3

或从Tbl2或Tbl3返回Tbl1。

虽然需要从Tbl2或Tbl3到Tbl1的关联,但是Tbl2或Tbl3中的记录可能不存在;因此Tbl1记录应该能够同时存在于我们的Tbl2和Tbl3中。

从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);


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


  从属角色属性不是关键属性,上限
  从属角色的多重性必须为“ *”。


这似乎暗示着外键也必须是记录键。

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

我很高兴用属性或流利的api或两者来实现。

最佳答案

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

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


即使您在Tbl1到Tbl2和Tbl3上定义了导航属性,外键注释也应在相关类(tbl2和tbl3)中而不是主体类中定义。

我不确定这是否可以解决整体问题,但也许会有所帮助。

祝好运

10-06 13:58