使用Criteria API在NHibernate中热切地加载集合

时间:2010-05-15 07:56:42

标签: nhibernate nhibernate-mapping criteria-api detachedcriteria createcriteria

我有一个实体A,它有HasMany实体B和实体C.所有实体A,B和C都有一些引用x,y和z,应该热切地加载。

我想从数据库中读取所有实体A,并使用条件API急切地加载B和C的集合。 到目前为止,我能够急切地获取'A'中的引用。但是当加载集合时,它们中的引用会被延迟加载。

我是这样做的

            AllEntities_A =
            _session.CreateCriteria(typeof(A))
            .SetFetchMode("x", FetchMode.Eager)
            .SetFetchMode("y", FetchMode.Eager)
            .List<A>().AsQueryable();

使用Fluent进行实体A的映射如下所示。 _B和_C是B&amp; C的私人IList。 C分别在A。

        Id(c => c.SystemId);
        Version(c => c.Version);
        References(c => c.x).Cascade.All();
        References(c => c.y).Cascade.All();

        HasMany<B>(Reveal.Property<A>("_B"))
            .AsBag()                
            .Cascade.AllDeleteOrphan()
            .Not.LazyLoad()
            .Inverse()
            .Cache.ReadWrite().IncludeAll();
        HasMany<C>(Reveal.Property<A>("_C"))
            .AsBag()
            .Cascade.AllDeleteOrphan()
            .LazyLoad()
            .Inverse()
            .Cache.ReadWrite().IncludeAll();

我不想对映射文件进行更改,并且想要热切地加载整个实体A.即我应该得到A的列表,其中将有B和C的列表,其参考属性也将被热切地加载

1 个答案:

答案 0 :(得分:3)

你想在这里做笛卡尔积。我认为NHibernate需要将关系映射为集合而不是袋子才能做到这一点,因为包允许重复。

无论如何,笛卡儿产品的效率非常低。改为使用多查询或将来的查询。

请参阅: