#c# #sql-server #entity-framework
#c# #sql-сервер #entity-framework
Вопрос:
Я хотел бы иметь сущность, у которой может быть дочерний элемент (один или ноль). Этот дочерний элемент имеет тот же тип, что и родительский. Я не уверен, как установить entity framework, потому что я хотел бы иметь два свойства навигации для каждого объекта. Один для перехода к дочернему и один для перехода к родительскому. По сути, это точно такая же структура, как и двусвязный список.
Я думаю, что этой структуры таблицы должно быть достаточно:
int | id | PK
int | id_next | FK
text | data
Но как я могу создать свойства навигации для следующих / предыдущих элементов? Я могу создать только свойство навигации для следующего элемента.
Спасибо за помощь.
Ответ №1:
Вы не можете. Проблема здесь в том, что взаимно однозначное отношение имеет очень специфическое требование — значение FK должно быть уникальным во всей таблице. Как только уникальность не будет принудительно установлена, вы можете добавить вторую сущность, указывающую на того же родителя, и у вас будет отношение «один ко многим».
Чтобы реализовать это в самоссылающемся отношении, подобном описанному вами в вашем примере, вы разместите уникальный индекс на id_next
, и он будет работать в SQL server. Проблема в том, что entity Framework не поддерживает уникальные ключи. Из-за этого entity framework способен строить взаимно однозначные отношения только между двумя разными типами сущностей, где FK в зависимом типе сущности также является его PK (единственный способ заставить FK быть уникальным) = обе сущности имеют одинаковое значение PK. Это не может работать с отношением, ссылающимся на себя, потому что у вас не может быть двух одинаковых значений PK в одной таблице.
Ответ №2:
Вы можете сделать это в EF4, указав отношение 0 ..1 -> 0 ..1 для объекта. Назовите одно из свойств навигации «Предыдущее», а другое «Следующее». Это создаст скрытое поле в базовой базе данных.
Я не тестировал этот подход досконально, но, похоже, он работал, когда я создавал скрипт базы данных.
Ответ №3:
Исследуйте древовидные структуры в Entity Framework. По сути, вам нужно вертикальное дерево (то есть одна ветвь). Платформа не будет применять только одну ветвь, но вы можете управлять этим в своей бизнес-логике.