我有这个实体类
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; }
}
答案 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行不能先插入。
也许您可以删除外键约束并在代码中自行管理关系,或者使用存储过程。