通过主键查询时的Nhibernate Eager加载
Nhibernate Eager load when querying by primary key
在我的存储库中,我通过其主键 (chainNumber
) 返回一个对象 (Chain
)。 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();
}
}
要告诉 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
的调用将抛出异常,因此下面的异常抛出有点多余
在我的存储库中,我通过其主键 (chainNumber
) 返回一个对象 (Chain
)。 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();
}
}
要告诉 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
的调用将抛出异常,因此下面的异常抛出有点多余