实体框架中的自引用有序关系

时间:2013-10-14 08:11:19

标签: .net entity-framework

忍受我 - 我不太确定如何解释这个...

我有一个'item'基类,在这种情况下想象它是一个任务。给定任务可以有子任务(多个子项),子任务可以有多个父项。

E.g。我可能会有一个名为“购买金枪鱼罐头”的任务,这可能是“购物”和“今天的任务”的子任务。

到目前为止一直很好,但是踢球者是我希望订购儿童任务。我无法在EF中看到如何做到这一点。我已经开始研究OrderedItem类的概念,但是我无法在EF中使用它。

修改

每个父子联接的排序需要是任意的。这意味着相同的项目将为每个父项具有不同的顺序。例如,购买金枪鱼可能是我今天的首要任务,但在我的购物清单上排名第11位。

关于最佳方法的任何想法?

Public MustInherit Class ItemBase
    Public Property ID As Integer
    Public Property Title As String
    Public Overridable Property Parents As ICollection(Of OrderedItem)
    Public Overridable Property Children As ICollection(Of OrderedItem)
End Class

Public Class OrderedItem
    <Key(), Column(Order:=0)> _
    Public Property ParentID As Integer
    <Key(), Column(Order:=1)> _
    Public Property ItemID As Integer
    Public Property Parent As ItemBase
    Public Property Item As ItemBase
    Public Property Order As Integer
End Class

1 个答案:

答案 0 :(得分:1)

根据您的编辑 - 您似乎做得很好,使用带有其他Order字段的联接表似乎是最好的方法。

请注意,OrderedItem的ParentIdItemId不是(因此不需要Key属性),它们是外来的密钥,引用实体表。 EF通常会从导航属性中自行计算外键,但是当识别整数属性(ItemID等)时,您可以使用ForeignKey("...")属性给它一个提示(请参阅这个回答:Foreign keys in entity framework 4.1

另请注意,OrderedItem的更好名称是ItemChildItemOrder或其他内容,因为它不代表业务实体,而是连接表条目。

编辑2:用法为item.Children.OrderBy(Function(child) child.Order).ToList()