Загрузка всего объекта с помощью Fluent NHibernate - PullRequest
2 голосов
/ 09 февраля 2012

Как загрузить полный объект (в котором есть все связанные объекты) с помощью Fluent NHibernate?В этом случае объект называется Project и имеет связанную категорию и список изображений.Файл сопоставления выглядит следующим образом:

        public ProjectMap()
    {
        Id(x => x.Id);

        Map(x => x.Title).Not.Nullable();
        Map(x => x.Year);
        Map(x => x.Slug).Not.Nullable();
        Map(x => x.Description).CustomSqlType("nvarchar(MAX)").Not.Nullable();
        References(x => x.Category, "CategoryId").Not.Nullable();
        HasMany(x => x.Gallery)
            .Inverse()
            .Cascade.All();
    }

И метод хранилища, который должен возвращать полный объект:

public Project Read(int id)
    {
        using (var session = NHibernateHelper.OpenSession())
        {
            var project = session.CreateQuery("FROM Project WHERE Id = :Id LEFT JOIN FETCH p.Category LEFT JOIN FETCH p.Gallery")
                .SetParameter("Id", id).UniqueResult<Project>();
            return project;
        }
    }

1 Ответ

3 голосов
/ 09 февраля 2012

Я предполагаю, что по умолчанию вы хотите отложенную загрузку, но иногда вы хотите загружать при необходимости. Если вы всегда хотите загружать (не рекомендуется), вы должны сделать это в сопоставлении вместо этого с помощью Not.Lazyload и выбрать стратегию выборки с помощью .Fetch ().

В противном случае вам придется использовать один из методов запроса в NHibernate, чтобы делать то, что вы хотите. Это можно сделать с помощью запроса HQL или запроса Linq и, возможно, запроса Criteria.

Вот запрос LINQ (он работает в 3.2, но не уверен, что он доступен раньше)

session.Linq<Project>()
    .Fetch(p => p.Category)
    .FetchMany(p => p.Gallery).FirstOrDefault();

Вот версия HQL

session.CreateQuery("SELECT p FROM Project p FETCH JOIN p.Category FETCH JOIN p.Gallery")
    .UniqueResult<Project>();

Вот версия критерия

session.CreateCriteria<Project>("p")
    .SetFetchMode("p.Category", FetchMode.Join)
    .SetFetchMode("p.Gallery", FetchMode.Join)
    .UniqueResult<Project>();
...