LINQ to SQL: Самоссылающаяся сущность - связь ParentID / ChildID - PullRequest
3 голосов
/ 02 февраля 2009

У меня есть сущность Task в моей базе данных Linq to SQL. Он сам ссылается на столбцы ID и ParentID. У меня есть ассоциация, которая связывает два идентификатора вместе.

похоже, что все хорошо работает в intellisense. Это позволит мне напечатать Task.Parent.ID и даже Task.Parent.Parent.ID и т. Д. Однако, это дает мне «Объектную ссылку, не установленную для экземпляра объекта». ошибка.

Все мои другие ассоциации прекрасно работают с моими другими объектами. Только ошибки самоссылающихся сущностей.

Есть ли что-то особенное, что мне нужно сделать, чтобы заставить его работать, или мне лучше просто добавить вторую сущность Task и назвать ее ParentTask и создать ассоциацию таким образом?

Ответы [ 2 ]

4 голосов
/ 02 февраля 2009

Ошибка произойдет, если вы пытаетесь получить Родителя для сущности, когда у него фактически нет Родителя. Все, что вы указали, прекрасно, и я много раз реализовывал подобные отношения.

Вы упомянули исключение, но не упомянули, когда оно произошло. Во время обновления? Возможно, есть нарушение ФК? Во время вставки? Или просто запрос?

Task.Parent.Parent.Parent.Parent - это не то, что вы можете делать бесконечно. Конечно, он скомпилируется, код не знает, что есть данные, поддерживающие этот оператор. Но во время выполнения каждый вызов .Parent должен соответствовать эквивалентному столбцу ParentID.

0 голосов
/ 02 февраля 2009

У меня не было проблем с корректным моделированием отношений в одной таблице в LINQ to SQL. Я запустил быстрый тестовый сценарий, чтобы воспроизвести то, что вы описываете, и он работал нормально (Item.Parent.ID, Item.Parent.Parent.Parent.Parent.ID и т. Д.)

Настройте профилировщик SQL и посмотрите, какой SQL пытается генерировать поставщик LINQ. Также взгляните на класс сущности в файле designer.cs и посмотрите, выглядит ли странно метод получения свойства Parent в Task.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...