我正在尝试定义这些表。
_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)中而不是主体类中定义。
我不确定这是否可以解决整体问题,但也许会有所帮助。
祝好运