通过主键查询时的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 方法以使用 QueryFetch:

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 的调用将抛出异常,因此下面的异常抛出有点多余