Мы используем решение, аналогичное Aaronaught, с Linq to SQL.
Мы создали вычисляемые столбцы
TreeId.ToString()
для текущего столбца иерархии и
[TreeId].[GetAncestor](1).ToString()
для прямых родителей.
Мы также создали представление, которое исключает иерархию-столбец, и перетащили это представление на Dbml-диаграмму и настроили связи с ссылочными таблицами.
Большинство функций иерархии должно быть в форме хранимых процедур.