我有一个实体 A,它有许多实体 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 分别是 A 中 B 和 C 的私有 IList。

        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。IE。我应该得到一个 A 列表,其中将有 B 和 C 列表,其引用属性也将被急切加载

有帮助吗?

解决方案

您正在尝试在这里做笛卡尔积。我认为 NHibernate 需要将关系映射为集合而不是包来做到这一点,因为包允许重复。

不管怎样,笛卡尔积的效率很低。请改用多重查询或未来查询。

看:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top