0

私は、HasManyエンティティBとエンティティCを持つエンティティAを持っています。すべてのエンティティ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全体を熱心にロードしたいと思います。つまり、参照プロパティも熱心にロードされるBとCのリストがあるAのリストを取得する必要があります

4

1 に答える 1

3

ここでデカルト積を実行しようとしています。バッグは複製を許可するので、NHibernateはそれを行うためにバッグではなくセットとしてリレーションをマッピングする必要があると思います。

とにかく、デカルト積は非常に非効率的です。代わりに、マルチクエリまたは将来のクエリを使用してください。

見る:

于 2010-05-15T15:11:28.163 に答える