【问题标题】:Self-referencing ordered relationships in entity framework实体框架中的自引用有序关系
【发布时间】:2013-10-14 08:11:19
【问题描述】:

请耐心等待 - 我不太清楚如何解释...

我有一个“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

【问题讨论】:

  • 已订购 - 怎么样?按创建顺序?
  • 顺序是任意的,并且是基于每个父母的。所以购买金枪鱼可能是我今天的第一要务,但在我的购物清单上排名第 11。
  • 如果是这样,您需要为每一行添加优先级

标签: .net entity-framework


【解决方案1】:

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

请注意,虽然 OrderedItem 的 ParentIdItemId 不是 (因此不需要 Key 属性),它们是 外键,引用实体表。 EF 通常会从导航属性中自行找出外键,但在识别整数属性(ItemID 等)时,您可以使用ForeignKey("...") 属性给它一个提示(请参阅此答案:@ 987654321@)

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

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

【讨论】:

  • 见上面的评论 - 顺序是任意的
  • 我已经使用 Key 注释将两个 id 用作复合键,而不是添加不必要的 ID 列。如果我添加外键注释,迁移会添加字段 ParentID、ItemID、ItemBase_ID 和 ItemBase_ID2。我如何告诉 EF 父项 ID 和项目 ID 将用于这种关系?
  • @JimmyP,我明白了。那你有什么问题? “我无法让它在 EF 中工作。”对我来说不是很清楚。
  • @JimmyP,你为什么要使用 ItemBase 抽象类,而不仅仅是 Item?我认为继承在这里没有任何用处。
  • 就是这样!很好,谢谢。我刚刚附加了一个 WillCascadeOnDelete(False) 来运行迁移。
猜你喜欢
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多