在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>
当您已经可以直接从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,另一个用于获取帐户。