Делает Linq к SQL, или Linq к Объектам 4.0 поддерживают hierarchyid тип данных

Их способ использовать linq для SQL/объектов 4.0 для работы с типом данных иерархии?

5
задан Luke101 20 April 2010 в 00:18
поделиться

2 ответа

Ни один из ORM семейства Microsoft в настоящее время не может использовать определяемые пользователем типы CLR (который включает встроенный идентификатор иерархии и геопространственные типы) в качестве типов столбцов.

Если вы используете их в своей базе данных, у вас есть два обходных пути:

  1. Добавьте вычисляемый столбец в таблицу иерархии с выражением CAST (hid AS varbinary892)) . Вам необходимо убедиться, что вы включаете этот столбец в каждый запрос (включая хранимые процедуры), который используется Linq. Затем добавьте этот столбец в отображение объекта.

    На этом этапе вы можете расширить частичный класс сущности, добавив «реальный» столбец ierarchyid в качестве собственного свойства, добавив ссылку на Microsoft.SqlServerTypes и используя Классы BinaryReader / BinaryWriter для преобразования данных BLOB в / из SqlHierarchyId .

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

  2. Другой вариант, который я обычно предпочитаю, заключается в том, чтобы вообще не использовать столбец hierarchyid изнутри L2S / EF. Добавьте суррогатный ключ auto-inc с отдельным индексом в таблицу иерархии и обработайте идентификатор иерархии как деталь реализации. Используйте UDF и представления для реализации иерархических запросов, для которых в качестве параметра требуется только суррогатный идентификатор.

    Это звучит неприятно, но на самом деле это не так уж плохо, если вы работаете таким образом с самого начала. До того, как Microsoft представила тип hierarchyid , я использовал адаптацию материализованной иерархии путей Денниса Форбса, которая основывалась на списке смежности и поддерживала путь как своего рода денормализацию. hierarchyid делает это намного проще.

    К сожалению, у меня нет полного рабочего примера всего, что вам нужно сделать для поддержания правильных ассоциаций между иерархией и списком смежности, но если вы читаете статью Денниса , это должно быть хорошее начало. Не реализуйте материализованный путь, используйте вместо него ierarchyid , но прочтите разделы о реализации самоподдерживающихся иерархий с триггерами.

    Если Microsoft когда-либо реализует поддержку hierarchyid в своих ORM, было бы легко удалить список смежности и переключиться исключительно на решение, основанное на ierarchyid . Но поскольку для управления иерархиями, основанными на ierarchyid , требуется множество хранимых процедур для поддержки в любом случае (поскольку вы не получаете «автоматические» идентификаторы), вам следует привыкнуть к написанию большого количества SQL UDF и абстракции хранимых процедур вокруг иерархических запросов.

9
ответ дан 14 December 2019 в 01:04
поделиться

Одним словом, нет. Во всяком случае, не напрямую. Однако вы могли бы обойти это так же, как и геопространственные типы . Я не пробовал.

​​
0
ответ дан 14 December 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: