在我的存储库中,我通过其主键(Chain
)返回一个对象(chainNumber
)。 Chain
有一系列步骤(ChainStep
)。
在按主代码查询时,如何急切加载步骤?
这是我的存储库代码。
public Chain Get(string chainNumber)
{
var chain = session.Get<Chain>(chainNumber);
if (chain == null)
{
throw new ObjectNotFoundException(
string.Format("Chain not found for number: {0}.", chainNumber));
}
return chain;
}
这是我的映射:
public class ChainMap: ClassMap<Chain>
{
public ChainMap()
{
Id(x => x.ChainNumber).Length(4).Not.Nullable();
//More properties
HasMany(x => x.Steps).Cascade.AllDeleteOrphan().Inverse();
}
}
答案 0 :(得分:1)
要告诉NHibernate 总是急切加载集合,您可以在映射中使用.Not.LazyLoad()
。这应该适合你:
public class ChainMap: ClassMap<Chain>
{
public ChainMap()
{
// ...
HasMany(x => x.Steps).Cascade.AllDeleteOrphan().Inverse().Not.LazyLoad();
}
}
如果您只是想要急切加载该集合的特定时间,则可以修改您的Get方法以使用Query
和Fetch
:
public Chain Get(string chainNumber)
{
var chain = session.Query<Chain>()
.Where(chain => chain.ChainNumber == chainNumber)
.Fetch(chain => chain.Steps)
.Single();
if (chain == null)
{
throw new ObjectNotFoundException(
string.Format("Chain not found for number: {0}.", chainNumber));
}
return chain;
}
第二种方法的优点是允许延迟加载保持此类型的默认值(对于代码库的其他部分可能无法立即访问子集合时)。
注意:如果不是一个匹配项,那么上面对Single
的调用会抛出一个异常,因此对于你的异常抛出来说它是多余的