powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate. Рефлексивная (деревянная) связь.
6 сообщений из 6, страница 1 из 1
NHibernate. Рефлексивная (деревянная) связь.
    #36740929
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!
Если с мэппингом рефлексивной связи вроде все понятно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
        Id(x => x.Id).GeneratedBy.Native();

        Map(x => x.Name)
            .Length(200)
            .Not.Nullable();

        References(x => x.ParentCategory)
            .Column("ParentCategoryId")
            .Access.CamelCaseField();

        HasMany(x => x.ChildCategories)
            .Cascade.AllDeleteOrphan()
            .AsSet()
            .KeyColumn("ParentCategoryId")
            .Access.CamelCaseField();
    }
}
, то по поводу извлечения данных существуют расхождения во мнениях.
Например, читал интересную статейку нашего соотечественника, внимал тонкостям, готовился воплотить "в железо", но комментарии в конце нее меня убили.
Гость:
"Так вообще делать нельзя. Будут дикие тормоза при работе с такими деревьями. Нужно использовать паттерн NestedSet!"
Автор статьи:
"Большое спасибо за совет. Сейчас буду смотреть что можно сделать в этом направлении :)"
( первоисточник: http://slynetblog.blogspot.com/2010/01/trees-and-nhibernate.html)

Так как же надо и как не надо работать с рефлексивными структурами в NHibernate?
Каким рекомендациям от лучших собаководов внимать?
Где искать пресловутый "паттерн NestedSet"?
...
Рейтинг: 0 / 0
NHibernate. Рефлексивная (деревянная) связь.
    #36740996
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

я тут сходу нашёл.
...
Рейтинг: 0 / 0
NHibernate. Рефлексивная (деревянная) связь.
    #36741210
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,
Спасибо! Гугль - великий кладезь знаний! Но я не совсем точно сформулировал свою мысль в первом посте.
Скорее меня больше интересует, как обойтись без извратов типа NestedSet.
Еще меня поражает, с какой легкостью апологеты ORM готовы ломать и кроить структуры БД в угоду своим целям. Ведь для них БД - всего лишь досадный довесок доменной модели, которая пока что не умеет хранить себя сама. На самом деле - БД - это СВЯТЫНЯ! В ней должно быть сердце предметной области. К тому же вовсе не обязательно, что Ваше приложение (использующее ORM) будет эксклюзивным клиентом БД.
Кстати, оракл имеет прекрасный инструментарий для обработки рефлексивных структур, типа "CONNECT BY PRIOR". Не попадалось ли Вам в этой связи чего полезного для NHibernate в Гугле?
...
Рейтинг: 0 / 0
NHibernate. Рефлексивная (деревянная) связь.
    #36741341
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

Во-первых, касательно вашего наезда на ORM. Вы определитесь со своей ориентацией: data-centric или domain-centric. Апологеты Domain Driven Design не издеваются над БД. ORM и применяемые способы сохранения объектов - вполне разумный компромисс. По-крайней мере, БД остаётся нормализованной.

Во-вторых, хранения деревьев - это в первую очередь грабли реляционных баз данных. И когда необходимы задачи в духе выбрать всю ветвь от корня, выбрать ветвь ниже данного узла и т.д. - без дополнительных извратов не обойтись. Можете не эту тему ознакомиться с трудами апологета баз данных Джо Селко.

А для NHibernate, если дерево маленькое - можете тупо грузить весь список в сессию.
...
Рейтинг: 0 / 0
NHibernate. Рефлексивная (деревянная) связь.
    #36741542
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,
Прошу извинить меня всех поклонников ORM! Я немного злюсь (на себя), когда не в полной мере владею вопросом и не могу быстро найти решение :)
Так все же, что делать, если дерево не маленькое?
Использовать Lasy Load?
В принципе, я не вижу крамолы в том, чтобы строить дерево на сервере приложений, а не пытаться "вытянуть" его изощренным SQL- или NHibernate-запросом.
...
Рейтинг: 0 / 0
NHibernate. Рефлексивная (деревянная) связь.
    #36741909
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльSolYUtor,
Так все же, что делать, если дерево не маленькое?

У меня нет ответа на ваш вопрос, т.к. тип и сложность применяемых велосипедов полностью зависит от вашей задачи. Среди вариантов, которыми можно отделаться дёшево, на ум приходит только следующее:
- Попробовать оставить только голый Lazy Load. Авось вас устроит производительность.
- Если надо обработать много узлов - загрузите их все в сессию.
- Кеш второго уровня.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate. Рефлексивная (деревянная) связь.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]