nHibernate - стремится получить список с уже заполненными дочерними списками - PullRequest
4 голосов
/ 12 мая 2010

У меня есть несколько объектов:

Public Class Person() {
    public int Id {get;set;}
    public IList<Account> Accounts {get;set;}
    public string Email {get; set;}
}

public class Account(){
    public int Id {get;set;}
    public IList<AccountPayment> Payments {get;set;}
    public IList<Venue> Venues {get;set;}
}

public class AccountPayment(){
    public int Id {get;set;}
    public DateTime PaymentDate {get;set;}
    public decimal PaymentAmount {get;set;}
}

public class Venue(){
    public int Id {get;set;}
    public string AddressLine1 {get;set;}
    public string Postcode {get;set;}
}

Эти классы отображаются в MS Sql с помощью nHibernate - в БД для каждого класса имеется таблица ...

Я хочу создать в моем репозитории метод GetAccounts (int PersonID), который будет возвращать список со всеми дочерними коллекциями учетной записи, заполненными наиболее эффективным способом. Может ли кто-нибудь дать мне какие-либо указания о том, как это сделать - я действительно не хочу устанавливать списки как подвыборы в моих сопоставлениях, если я могу помочь ...

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 мая 2010

Если вы сопоставили свои классы с таблицами, как вы упоминаете, почему бы вам просто не вызвать объект Person, чтобы получить все их учетные записи? Когда вы вызываете объект Person из своего хранилища, вы можете загружать учетные записи. Вот так:

 public Person GetById(int id)
    {
        using (var tx = _sessionBuilder.GetSession().BeginTransaction())
        {
            // -- Lazy load way --
            //Person person = _sessionBuilder.GetSession().Get<Person>(id);
            //tx.Commit();
            //return person;

            // -- Eager load way --                
            Person person = _sessionBuilder.GetSession().CreateCriteria<Person>()
                   .Add(Restrictions.IdEq(id))
                   .SetFetchMode("Accounts", FetchMode.Eager)
                   .UniqueResult<Person>();
            tx.Commit();
            return person;
        }
    }
0 голосов
/ 13 мая 2010

Хорошо, после попытки сделать это разными способами, я в итоге обнаружил, что наиболее эффективное решение для меня изложено в этом вопросе:

Стремительная загрузка дочерней коллекции с помощью NHibernate

Мой вопрос, приведенный выше, был значительно упрощенной версией реальной проблемы, с которой я столкнулся, но с помощью вышеописанного метода удалось уменьшить количество попаданий в базу данных до 2 ... огромное улучшение по сравнению с моей первоначальной реализацией.

Спасибо за вашу помощь и указатели, ребята. Немного узнал по пути ...

...