Их способ использовать linq для SQL/объектов 4.0 для работы с типом данных иерархии?
Ни один из ORM семейства Microsoft в настоящее время не может использовать определяемые пользователем типы CLR (который включает встроенный идентификатор иерархии
и геопространственные типы) в качестве типов столбцов.
Если вы используете их в своей базе данных, у вас есть два обходных пути:
Добавьте вычисляемый столбец в таблицу иерархии с выражением CAST (hid AS varbinary892))
. Вам необходимо убедиться, что вы включаете этот столбец в каждый запрос (включая хранимые процедуры), который используется Linq. Затем добавьте этот столбец в отображение объекта.
На этом этапе вы можете расширить частичный класс сущности, добавив «реальный» столбец ierarchyid
в качестве собственного свойства, добавив ссылку на Microsoft.SqlServerTypes
и используя Классы BinaryReader
/ BinaryWriter
для преобразования данных BLOB в / из SqlHierarchyId
.
Обратите внимание, что вы не можете писать запросы Linq для этого столбца . Если вы попытаетесь, вы получите сообщение об ошибке «перевод не поддерживается». Так что имейте в виду, что это ограниченный обходной путь.
Другой вариант, который я обычно предпочитаю, заключается в том, чтобы вообще не использовать столбец hierarchyid
изнутри L2S / EF. Добавьте суррогатный ключ auto-inc с отдельным индексом в таблицу иерархии и обработайте идентификатор иерархии
как деталь реализации. Используйте UDF и представления для реализации иерархических запросов, для которых в качестве параметра требуется только суррогатный идентификатор.
Это звучит неприятно, но на самом деле это не так уж плохо, если вы работаете таким образом с самого начала. До того, как Microsoft представила тип hierarchyid
, я использовал адаптацию материализованной иерархии путей Денниса Форбса, которая основывалась на списке смежности и поддерживала путь как своего рода денормализацию. hierarchyid
делает это намного проще.
К сожалению, у меня нет полного рабочего примера всего, что вам нужно сделать для поддержания правильных ассоциаций между иерархией
и списком смежности, но если вы читаете статью Денниса , это должно быть хорошее начало. Не реализуйте материализованный путь, используйте вместо него ierarchyid
, но прочтите разделы о реализации самоподдерживающихся иерархий с триггерами.
Если Microsoft когда-либо реализует поддержку hierarchyid
в своих ORM, было бы легко удалить список смежности и переключиться исключительно на решение, основанное на ierarchyid
. Но поскольку для управления иерархиями, основанными на ierarchyid
, требуется множество хранимых процедур для поддержки в любом случае (поскольку вы не получаете «автоматические» идентификаторы), вам следует привыкнуть к написанию большого количества SQL UDF и абстракции хранимых процедур вокруг иерархических запросов.
Одним словом, нет. Во всяком случае, не напрямую. Однако вы могли бы обойти это так же, как и геопространственные типы . Я не пробовал.