powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Iclude в NHibernate
25 сообщений из 110, страница 1 из 5
Iclude в NHibernate
    #37762207
besserebrenik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток

Работая с EF (c включенным lazyLoading), если я хотел получить n+1 сущность, то я использовал метод Include(string entityName) класса ObjectSet<Entity>

Например, чтобы сразу загрузить все категории и их статьи я писал что-то похожее на данный код (давно EF использовал)

return ObjectSet<Category>.Include("Post");

Недавно познакомился с NHibernate и пока не могу найти аналогичную возможность в данном ORM. Она должна быть, но наверно я неправильно ищу.

Подскажите, как выгружать n+1 сущность в nHibernate

Я пару недель назад, когда задавался этим вопросом, то пытался реализовать это следующим образом

Код: c#
1.
2.
3.
4.
5.
Session.CreateCriteria(typeof(Сategory))

    .SetFetchMode("Post", FetchMode.Eager)

    .List();



Но NHProfiler показал, что загружены только категории
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37762459
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
besserebrenik,

ICriteria - двоольно старый API. Если нет принципиальных возражений - используйте QueryOver:
Код: c#
1.
2.
3.
4.
currentSession
  .QueryOver<Сategory>()
  .Fetch(x => x.Post).Eager
  .List<Сategory>();
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37762465
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
besserebrenik,

А уже если не боитесь строк, то hql делает еще проще:
Код: c#
1.
session.CreateQuery("from Category c join fetch c.Post").List<Category>(); //Если надо -  добавить left к join
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37763314
besserebrenik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,
Спасибо за ответ, сегодня опробую в учебных примерах

Строк не боюсь, т.к. код в репозиториях будет спрятан - главное, чтобы работал подход :)
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37763731
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
besserebrenik,

Репозиторий при наличии хорошей ORM - зло , зло , зло .
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37764846
besserebrenik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

И снова спасибо за ответ!
Это правда уже оффтоп, но действительно я набил шишек на тех вещах, которые реально не дают пользы. Я очень долго пытался впихнуть презентеры в свой дипломный проект, но оказалось, что это абсолютно ненужная вещь, если доменная модель не аннемична (anemic domain model).
Rich Domain Model (не ошибся надеюсь в терминах), в которой инкапсулирована логика предметной области и соответственно тщательно протестирована, дополнительного слоя, для представления, не требует. Еще больше времени я убил на изучение паттерна Unit Of Work , который в большинстве реализаций был обычной оберткой над транзакцией и зачастую весьма сложной.

Но насчет репозиториев нужно подумать и возможно набить шишки самому.. Пока что один абстрактный репозиторий , и его реализации на каждый aggregation-root для меня это не так страшно.. Хотя это в идеале, обычно репозиториев больше.

За ссылки спасибо большое, очень интересно!
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765036
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
besserebrenik,

если позволите, еще пару советов напоследок:
1. Хорошая практика при использовании NHibernate - это рассматривать ISession как UnitOfWork. Все изменения в объектах, сделанные в рамках сессии будут автоматом сброшены в бд.
2. Rich Domain Model описывающая логику предметной области не всегда хорошо для непосредственно отображения. Поэтому частенько разрабатывают дополнительную модель, описывающую логику представления (это, что Фаулер ранее называл Presentation Model, а теперь более модно называть MVVM).
3. Презентеры вещь хорошая, но требует некоторого опыта и понимаю. В общем, для понимания, как строить UI очень советую осилить серию блогов от Jeremy D. Miller 'а.
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765088
besserebrenik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

Позвольте я объясню свое разочарование в MVP, (я с начала пытался сделать чистый MVP, но по ходу работы у меня выродилось в Presentation Model)

Я использовал presentation model, но буквально недавно я снес проект, содержащий слой презентеров, из своего решения и одна из причин, заставившей меня это сделать, объяснена ниже

Интерфейс вьюшки
1 отображает список некоторой доменной сущности
2 может показывать ошибку
3 спрашивать подтверждения пользователя
4 содержит две кнопки, первая - закроет въюшку, вторая откроет новый вью с отображением более подробной информации о доменной сущности
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
interface IViewInterface
    {
        void SetDomainSomeEntitiesList(IList<DomainSomeEntities> entities);
        void ShowError(string error);
        bool GetConfirmation(string question); 
        event EventHandler BeforeViewClosed;
        event EventHandler ShowDomainSomeEntitiesDetailPressed; 
    }



презентер, продемонстрирован только конструктор
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class DomainSomeEntitiesListPresenter
    {
        private readonly IViewInterface _view;
        private readonly ICollection<DomainSomeEntities>  _model; 
      
        public DomainSomeEntitiesListPresenter(IViewInterface view, ICollection<DomainSomeEntities> model)
        {
            _model = model; 
            _view = view;
        }
    }



И реализация view

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
 class View : Form, IViewInterface
    {
        #region Implementation of IViewInterface

        public void SetDomainSomeEntitiesList(IList<DomainSomeEntities> entities)
        {
            // грид или другой, используемый нами компонент, обновил данные 
            _bindingSource.DataSource = entities; 
        }

        public void ShowError(string error)
        {
            MessageBox.Show(error); 
        }

        public bool GetConfirmation(string question)
        {
            return new DialogResultForm(message).ShowDialog() == DialogResult.OK; 
        }

        public event EventHandler BeforeViewClosed;
        public event EventHandler ShowDomainSomeEntitiesDetailPressed;

        private void FormCloseBeforePressed(object sender, EventArgs e)
        {
            if (BeforeViewClosed != null)
            {
                BeforeViewClosed(this, EventArgs.Empty); 
            }
        }

        private void ButtonShowDetailClicked(object sender, EventArgs e)
        {
            if (ShowDomainSomeEntitiesDetailPressed != null)
            {
                ShowDomainSomeEntitiesDetailPressed(this, EventArgs.Empty); 
            }
        }

        #endregion
    }



и фрагмент из точки старта приложения

Код: c#
1.
2.
3.
4.
var view = new View() 
ICollection<DomainSomeEntities> collection = SomeDataLayerServiceOrRepositoryOrOrmSession.GetSomeDomainCollection(); 
new Presenter(IView, collection); 
Application.Start(view); 



Проблема для меня начинается, когда пользователь щелкает по кнопке - "показать детально".
Возникает вопрос - презентер должен создать новый вью для отображения детальных данных сущности и передать ей эту самую сущность?
Но тогда презентер знает о реализации вью (хотя это можно обойти через IoC, но из пушки по воробъям..)
Или когда пользователь щелкает по кнопке, я должен создать во вью новую форму для детального отображения сущности, создать соответствующий презентер и передать, в качестве модели, _bindingSource.Current ?
ну примерно так
Код: c#
1.
2.
3.
4.
5.
6.
private void ButtonShowDetailClicked(object sender, EventArgs e)
        {
            DetailViewForm detailView = new DetailViewForm();  
            DetailPresenter detailPresenter = new DetailPresenter(detailView, _bindingSource.Current );
            detailView.View();  
        }



Но в таком случае уже вью знает о презентере )))
Ведь по идее, проект со вьюшками видит модель и сборку с презентерами. Сборка с презентерами также знает о модели. А презентеры знают только об интерфейсах вью (их предпочтительно расположить в сборке с презентарами). Но хотя если не заморачиваться об областях видимости, то я бы предпочел второй подход - когда view создает соответствующий презентер и передает ему модель.

Почему-то вопросам навигацию в MVP посвящено очень мало внимания :(
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765090
besserebrenik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
besserebrenik,

P.S. извиняюсь перед администратором за оффтоп, я сильно отошел от темы в заголовке
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765094
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
besserebrenik,

да забей ты на этих шаблонистов
создай свои шаблоны - удобные и эффективные для тебя
илиты хошь дело догматиков продолжить?
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765108
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот фрагмент домена
прога сама должна по семантике связей (+ доп семантика введенная пользователем) создавать агрегатные типы (include твои) для заданного контекста, визуализировать автоматически данный агрегат (разные представления агрегата в контексте визуализации) и обеспечить целостность агрегата в заданном контексте и в контексте домена.

А всех фаулеров и гамм на пенсию нафиг. заодно и буча.
почему то болбаный форум не принимет картинки. никак муся старался.
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765206
besserebrenik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

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

Если кода не так много, то может через спойлер сюда или ссылочку на репозиторий ..
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765212
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
besserebrenik,

не дает форум прикрепить
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765215
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
догматисты = (по русски) догматики
:)
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765226
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исправили
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765238
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотри какой инфой прога владеет
что ей стоит самой интерпретировать метаинфу
это только структурная инфа, а есть и поведенческая
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765242
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765244
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

теперь мы говорим - создай персистентный агрегат (выбранные типы)
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765245
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тфу
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765247
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получаем агрегат
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765248
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

визуализируем
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765515
besserebrenik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

Впечатляет!
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765517
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorРепозиторий при наличии хорошей ORM - зло, зло, зло
а если вдруг понадобится сменить ORM? месяцами будете переделывать?
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37765744
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77а если вдруг понадобится сменить ORM? месяцами будете переделывать?
Зачем страдать фигнёй исходя из ложного предположения?
И ссылки почитайте, полезно будет.
...
Рейтинг: 0 / 0
Iclude в NHibernate
    #37768820
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
besserebrenikViPRos,

Впечатляет!
и, как уже несколько раз замечено, тут обсуждение вопроса сразу обрывается :)
с чего бы это?
...
Рейтинг: 0 / 0
25 сообщений из 110, страница 1 из 5
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Iclude в NHibernate
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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