假设我有一个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>
答案 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,另一个用于获取帐户。