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

.net 实体框架中的自引用有序关系,.net,entity-framework,.net,Entity Framework,请容忍我-我不太确定如何解释这个 我有一个“item”基类,在本例中,将其想象为一个任务。给定任务可以有子任务(多个子任务),子任务可以有多个父任务 例如,我可能有一个名为“购买罐装金枪鱼”的任务,这可能会作为“购物”和“今天的任务”的子任务出现 到目前为止一切都很好,但关键是我希望子任务能够有序进行。我不知道如何在EF中执行此操作。我已经开始研究OrderedItem类的概念,但在EF中无法实现 编辑: 对于每个父子联接,排序需要是任意的。这意味着每个父项的相同项的顺序不同。例如,购买金枪鱼可

请容忍我-我不太确定如何解释这个

我有一个“item”基类,在本例中,将其想象为一个任务。给定任务可以有子任务(多个子任务),子任务可以有多个父任务

例如,我可能有一个名为“购买罐装金枪鱼”的任务,这可能会作为“购物”和“今天的任务”的子任务出现

到目前为止一切都很好,但关键是我希望子任务能够有序进行。我不知道如何在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
Public MustInherit类ItemBase
作为整数的公共属性ID
公共财产所有权作为字符串
作为(OrderedItem的)ICollection的公共可重写属性父级
作为(OrderedItem的)ICollection的公共可重写属性子级
末级
公共类OrderedItem
_
公共属性ParentID为整数
_
公共属性ItemID为整数
作为ItemBase的公共属性父级
作为ItemBase的公共属性项
作为整数的公共财产秩序
末级

根据您的编辑-您似乎做得很好,使用带有附加
顺序
字段的联接表似乎是最好的方法

请注意,尽管OrderedItem的
ParentId
ItemId
不是键(因此不需要
Key
属性),但它们是外键,引用实体表。EF通常会自己从导航属性中找出外键,但当涉及到识别整数属性(
ItemID
等)时,您可以使用
ForeignKey(“…”)
属性给它一个提示(请参见此答案:)

还请注意,
OrderedItem
的更好名称应该是
ItemChildItemOrder
或其他名称,因为它并不表示业务实体,而是表示联接表条目


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

如何排序?按创建顺序?顺序将是任意的,并且基于每个父级。因此,购买金枪鱼可能是我今天的首要任务,但却是我购物清单上的第11项。如果是这样,你需要为每一行添加一个优先级,请参见上面的注释-顺序将是任意的。我使用了键注释,将两个ID用作复合键,而不是添加不必要的ID列。如果我添加外键注释,迁移会添加ParentID、ItemID、ItemBase\u ID和ItemBase\u ID2字段。我如何告诉EF父项和项id将用于此关系?@JimmyP,我明白了。那你有什么问题?“我不能在EF中使用它。”这对我来说不是很清楚。@JimmyP,你为什么要使用ItemBase抽象类,而不仅仅是Item?我不认为继承在这里有任何用处,就是这样!太好了,谢谢。我刚刚附加了一个WillCascadeOnDelete(False)来运行迁移。