Получить дочерние объекты по идентификатору или родительскому объекту в NHibernate? - PullRequest
1 голос
/ 17 января 2012

Допустим, у меня есть класс Broker с коллекцией Accounts.Класс Broker отображается на таблицу базы данных с именем brokers, класс Account отображается на таблицу базы данных с именем accounts.то есть

public class Broker
{
    public virtual IEnumerable<Account> Accounts
    {
        get { return _accounts; }
        protected set { _accounts = new HashSet<Account>(value); }
    }
    // other properties
}

public class Account 
{                
    public virtual Broker Broker { get; set; }
    // other properties
}

Я хочу написать метод для возврата списка учетных записей для Broker, и я не уверен, какой должна быть подпись.Я думал о двух, но не уверен, что пойти на:

IList<Account> GetBrokerAccounts(Broker broker)

или

IList<Account> GetBrokerAccounts(int brokerId)

Я был бы заинтересован отпроектная точка зрения плюсы и минусы каждого и что будет «наилучшей практикой».

Edit

Вот мой файл сопоставления для моей проблемы сбора:

  <class name="MooDB.Domain.Broker,MooDB" table="brokers" >
    <id name="Id" column="brokerId" type="Int32" unsaved-value="0">
      <generator class="increment" />
    </id>
    <version name="Version" column="version" type="integer" unsaved-value="0" />
    <property name="Name" column="`name`" type="String" length="50" not-null="true" />
    <property name="IsActive" column="isActive" type="bool" not-null="true" />
    <property name="IsDefault" column="isDefault" type="bool" not-null="true" />
    <set name="BrokerInstruments" table="brokerInstruments" generic="true" inverse="true" lazy="true" cascade="delete">
      <key column="brokerId" />
      <one-to-many class="MooDB.Domain.BrokerInstrument" />
    </set>
    <set name="Accounts" table="accounts" generic="true" inverse="true" lazy="false" cascade="delete">
      <key column="accountId" />
      <one-to-many class="MooDB.Domain.Account,MooDB"/>
    </set>
  </class>

Ответы [ 3 ]

1 голос
/ 17 января 2012

Не знаю, зачем вам нужен любой из двух методов, когда вы уже можете получить доступ к списку учетных записей непосредственно из объекта Broker.

var brokersAccounts = broker.Accounts;

NHibernate уже сделает необходимую работу за вас. Другими словами, сначала найдите объект / сущность брокера и перечислите его счета.

0 голосов
/ 17 января 2012

Используйте метод Load. Он создает прокси и, таким образом, вы избегаете загрузки Брокера, если вас интересуют только учетные записи.

public IList<Account> GetBrokerAccounts(int brokerId)
{
    return session.QueryOver<Account>()
    .Where(x => x.Broker == session.Load(brokerId)).List();
}

Таким образом, если вы получаете brokerId из пользовательского интерфейса, нет необходимости загружать объект Broker из базы данных, поскольку вы знаете, что он существует в базе данных. Приведенный выше код в основном создаст select * из учетной записи, где broker = brokerId тип запроса. Если бы вы использовали Get, он генерировал бы два запроса. Один для загрузки брокера и второй для получения счетов.

0 голосов
/ 17 января 2012

Используйте идентификатор, brokerId.Лучше (я не верю в лучшие практики) использовать самые простые возможные аргументы и возвращаемые типы.Передача только идентификатора, как правило, гораздо полезнее в приложении без сохранения состояния, например в веб-приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...