在NHibernate中按id或父对象获取子对象

本文关键字:对象 获取 NHibernate 中按 id | 更新日期: 2023-09-27 18:20:44

假设我有一个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)

从设计的角度来看,我会对每种方法的优缺点以及什么是"最佳实践"感兴趣。

编辑

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

  <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>

在NHibernate中按id或父对象获取子对象

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

var brokersAccounts = broker.Accounts;

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

使用id,brokerId。使用尽可能简单的参数和返回类型是更好的做法(我不相信最佳做法)。在无状态应用程序(如web应用程序)中,只传递id通常也更有用。

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

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

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