在NHibernate中通过id或父对象获取子对象?

时间:2012-01-17 12:07:18

标签: c# nhibernate

假设我有一个Broker类,其集合为AccountsBroker类映射到名为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)

从设计的角度来看,我感兴趣的是每种方法的优点和缺点以及“最佳实践”。

修改

这是我的收集问题的映射文件:

  <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 个答案:

答案 0 :(得分:1)

当您已经可以直接从Broker对象访问帐户列表时,不确定为什么需要这两种方法中的任何一种。

var brokersAccounts = broker.Accounts;

NHibernate已经为你做了必要的工作。换句话说,首先找到代理对象/实体并通过其帐户进行枚举。

答案 1 :(得分:0)

使用id,brokerId。使用最简单的参数和返回类型是一种更好的做法(我不相信最佳实践)。仅传递id通常在无状态应用程序(例如Web应用程序)中更有用。

答案 2 :(得分:0)

使用Load方法。它创建代理,因此如果您只对帐户感兴趣,则可以避免加载代理。

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

因此,如果从UI获取brokerId,则无需从数据库加载Broker对象,因为您知道它存在于数据库中。上面的代码基本上将创建select * from broker,其中broker = brokerId类型的查询。如果您使用Get,它将生成两个查询。一个用于加载Broker,另一个用于获取帐户。

相关问题