EF代码优先 - 定义双向导航属性

时间:2016-01-14 06:07:58

标签: c# entity-framework

我有这个实体类

public class Node
{
    [Key]
    public int Id { get; private set; }
    public string Name { get; set; }
    public virtual Node Prev { get; set; }
    public virtual Node Next { get; set; }
}

节点将始终具有0或1个上一个节点以及0或1个下一个节点。

我希望EF能够生成以下表格模式

Id | Name | Prev_Id | Next_Id

您很快就会注意到,Next_Id是多余的,因为Prev_Id足以定义方向关系。

我对此表模式的目的是有效地查询节点是否具有上一个/下一个节点而不在其自己的表上执行连接操作。我很乐意采取权衡,我必须编写额外的逻辑来维持上一个/下一个id的正确性。

这是我的问题:

EF无法使用以下错误创建此类表:

  

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

我想知道EF是否允许这样的设计以及如何设计。

更新

我改为这个并且仍然有同样的错误

public class Node
{
    [Key]
    public int Id { get; private set; }
    public string Name { get; set; }
    public int PrevId { get; set; }
    public int NextId { get; set; }
    [ForeignKey("PrevId")]
    public virtual Node Prev { get; set; }
    [ForeignKey("NextId")]
    public virtual Node Next { get; set; }
}

1 个答案:

答案 0 :(得分:0)

我认为你不能这样做。考虑重新设计表模式。让我们说我想添加3个新节点,如下所示:

var first = new Node { Name = "first" };
var second = new Node { Name = "second" };
var third = new Node { Name = "third" };

first.Next = second;
second.Prev = first;
second.Next = third;
third.Prev = second;

---- expected table data ----
Id       Name         PrevId        NextId
1        first         NULL           2
2        second         1             3
3        third          2            NULL

现在你告诉我应该先插入哪一行。如果首先插入id = 1行,则会破坏外键约束,因为NextId = 2不存在。类似地,id = 2& id = 3行不能先插入。

也许您可以删除外键约束并在代码中自行管理关系,或者使用存储过程。