在我的存储库中,我通过主键(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();
}
}发布于 2015-08-27 16:16:03
要告诉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的调用将抛出一个异常,如果没有完全匹配,那么在下面抛出异常是多余的。
https://stackoverflow.com/questions/32254210
复制相似问题