2013-10-14 2 views
0

Медведя со мной - я не совсем уверен, как это объяснить ...автореферентных упорядоченных отношений в рамках сущности

У меня есть «пункт» базовый класс, в этом случае представить себе, что это задача , Задача может иметь подзадачи (несколько дочерних), а дочерняя задача может иметь несколько родителей.

E.g. У меня могла бы быть задача «купить консервированный тунец», это могло бы стать подзадачей «шоппинга», а также «сегодняшних задач».

До сих пор так хорошо, но кикер - это то, что я хочу, чтобы детские задания были заказаны. Я не вижу, как это сделать в EF. Я начал работать над понятием класса OrderedItem, но я не могу заставить его работать в EF.

Edit:

Упорядочение должно быть произвольным для каждого родителя ребенка присоединиться. Это означает, что у одного и того же элемента будет другой порядок для каждого родителя. Например, покупка тунца может быть моим приоритетом номер один на сегодняшний день, но номер 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 
+0

заказал - как? по порядку создания? – staafl

+0

Заказ будет произвольным и находится на родительском основании. Так что покупка тунца может быть моим приоритетом номер один на сегодняшний день, но номер 11 в моем списке покупок. – JimmyP

+0

Хорошо, если это так, вам нужно добавить приоритет для каждой строки – VeNoMiS

ответ

1

За ваши изменения - кажется, вы должны делать достаточно хорошо, используя таблицы объединения с дополнительным Order поле, казалось бы, самый лучший подход.

Примечания хотя, что OrderedItem-х ParentId и ItemId не ключей (поэтому нет необходимости для атрибута Key), они являются внешними ключами, ссылающихся таблицу сущностей. EF обычно выяснить внешние ключи на своем собственной основе навигационных свойств, но когда дело доходит до признания целочисленных свойств (ItemID и т.д.), вы можете дать ему подсказку, используя атрибут ForeignKey("...") (см этого ответа: Foreign keys in entity framework 4.1)

Также обратите внимание, что лучшим именем для OrderedItem будет ItemChildItemOrder или что-то, так как он не представляет собой бизнес-объект, а запись таблицы соединений.

Edit 2: Использование будет item.Children.OrderBy(Function(child) child.Order).ToList()

+0

См. Комментарий выше - заказ будет произвольным – JimmyP

+0

@JimmyP, см. Мое редактирование – staafl

+0

Я использовал аннотацию Key для использования двух идентификаторов как составного ключа, а чем добавление ненужного столбца идентификатора. Если я добавлю аннотации внешнего ключа, в миграции добавятся поля ParentID, ItemID, ItemBase_ID и ItemBase_ID2. Как я могу сказать EF, что для этого отношения должны использоваться идентификаторы parent и item? – JimmyP

Смежные вопросы