我正在尝试定义这些表格。
_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);
使用上面的内容我得到错误:
依赖角色属性不是关键属性,即上限 依赖角色的多样性必须是&#39; *&#39;。
这似乎意味着外键也必须是记录键。
那么,我可以这样做吗?我可以吗?。
我很乐意使用属性或流畅的api或两者来实现。
答案 0 :(得分:2)
我认为您的ForeignKey
属性需要引用一列并放在导航属性上方。 e.g:
[ForeignKey("Tbl1Id")]
public virtual Tbl1 tbl1 {get; set;}
即使您在Tbl1到Tbl2和Tbl3上定义了导航属性,外键注释也应该在依赖类(tbl2和tbl3)中定义,而不是在主类中定义。
我不确定这是否能解决整体问题,但也许会有所帮助。
祝你好运答案 1 :(得分:2)
正如其他类似问题的问题一样;可以通过对实体键使用相同的属性和依赖实体上的主体实体的外键来实现一对一或零。
我没有看到另一种方式,因为在SQL中创建一对一或零将要求外键具有唯一性约束,最终结果几乎相同。