C# 按主键查询时的Nhibernate即时加载

C# 按主键查询时的Nhibernate即时加载,c#,nhibernate,C#,Nhibernate,在我的存储库中,我通过主键(chainNumber)返回一个对象(Chain)链包含一组步骤(链步骤) 按主代码查询时,如何加载步骤 这是我的存储库代码 public Chain Get(string chainNumber) { var chain = session.Get<Chain>(chainNumber); if (chain == null) { throw new ObjectNotFoundException(

在我的存储库中,我通过主键(
chainNumber
)返回一个对象(
Chain
)<代码>链包含一组步骤(
链步骤

按主代码查询时,如何加载步骤

这是我的存储库代码

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;
}
公共链获取(字符串链号)
{
var chain=session.Get(chainNumber);
如果(链==null)
{
抛出新的ObjectNotFoundException(
格式(“未找到编号为“{0}.”,chainNumber)的链);
}
返回链;
}
以下是我的映射:

public class ChainMap: ClassMap<Chain>
{
    public ChainMap()
    {
        Id(x => x.ChainNumber).Length(4).Not.Nullable();
        //More properties
        HasMany(x => x.Steps).Cascade.AllDeleteOrphan().Inverse();
    }
}
公共类链映射:类映射
{
公共链图()
{
Id(x=>x.ChainNumber).Length(4).Not.Nullable();
//更多属性
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();
    }
}
第二种方法的优点是允许延迟加载保留此类型的默认值(当代码库的其他部分可能无法立即访问子集合时)

注意:如果没有一个匹配项,那么对上面的
Single
的调用将抛出一个异常,因此它与下面的异常抛出有点多余

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;
}