首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nhibernate在按主键查询时急切地加载

Nhibernate在按主键查询时急切地加载
EN

Stack Overflow用户
提问于 2015-08-27 15:54:49
回答 1查看 50关注 0票数 1

在我的存储库中,我通过主键(Chain)返回一个对象(chainNumber)。Chain有一个步骤集合(ChainStep)。

在通过主代码查询时,我如何急切地加载这些步骤?

这是我的存储库代码。

代码语言:javascript
复制
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;
}

这是我的地图:

代码语言:javascript
复制
public class ChainMap: ClassMap<Chain>
{
    public ChainMap()
    {
        Id(x => x.ChainNumber).Length(4).Not.Nullable();
        //More properties
        HasMany(x => x.Steps).Cascade.AllDeleteOrphan().Inverse();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-27 16:16:03

要告诉NHibernate总是急切地加载集合,可以在映射中使用.Not.LazyLoad()。这应该适用于你:

代码语言:javascript
复制
public class ChainMap: ClassMap<Chain>
{
    public ChainMap()
    {
        // ...
        HasMany(x => x.Steps).Cascade.AllDeleteOrphan().Inverse().Not.LazyLoad();
    }
}

如果有一些特定的时间需要急切地加载集合,则可以修改Get方法以使用QueryFetch

代码语言:javascript
复制
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的调用将抛出一个异常,如果没有完全匹配,那么在下面抛出异常是多余的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32254210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档