0

FluentNHibernate 1.3 を使用して NHibernate 3.2 にマッピングされたこのクラスがあります。

public class ClassA
{
    public virtual Int32 Id{ get; }
    ....
    public ICollection<ClassB> ClassesB { get; }
    public ICollection<ClassC> ClassesC { get; }
}

public class ClassB
{
    public virtual Int32 Id{ get; }
    ....
    public ICollection<ClassA> ClassesA { get; }
    public ICollection<ClassC> ClassesC { get; }
}

public class ClassC
{
    public virtual Int32 Id{ get; }
    ....
    public ICollection<ClassA> ClassesA { get; }
    public ICollection<ClassB> ClassesB { get; }
}

すべてのマッピングが正しく機能し、仕様どおりに機能します。しかし、たとえば、特定の ClassB または ClassA インスタンス内のすべての ClassC インスタンスを返すクエリを LINQ で作成する必要があります。ClassC のリストを取得する前に、ClassB または ClassA インスタンスをロードせずにこれを行う必要があります。インスタンスの ID を使用してクエリを作成するだけです。

たとえば、ClassB インスタンスをロードしてから ClassesC コレクションを取得できることはわかっていますが、アプリケーションの設計では、それを行わずにこれを行う必要があります。これを、グリッドでのページングやその他のさまざまな操作に使用します。ページングから。

純粋な SQL では単純な結合クエリでそれを行うことができますが、LINQ でそれを行う方法がわかりません。また、HQL または ICriteria のオプションは必要ありません。アプリケーションは NHibernate の存在を認識してはならないプラグインを使用するため、LINQ (拡張機能が望ましい) で行う必要があります。プラグインは、クエリを作成するために IQueryable インスタンスを受け取ります (これにより、プラグインやアプリケーションの他の部分を再コンパイルすることなく、コア アプリケーションを NoSQL などの他のデータベース スキーマに簡単に移植できます)。

事前にご協力いただきありがとうございます。

4

1 に答える 1

0

デフォルトHasManyでは、FluentNHibernate はコレクションを遅延ロードします。流暢な構文を使用してこれを構成できます。

遅延読み込みの例:

class ClassAMap : ClassMap<ClassA>
{
    public ClassAMap()
    {
    // ...
    // lazy loading using select
    HasMany(x => x.ClassesB)
        .LazyLoad()
        .Fetch.Select()
    // ...
}

または貪欲な読み込みを使用してjoin:

class ClassAMap : ClassMap<ClassA>
{
    public ClassAMap()
    {
    // ...
    // greedy loading using join
    HasMany(x => x.ClassesB)
        .Fetch.Join()
    // ...
}

または慣例

Table.Is(x => x.EntityType.Name + "Table")
    DefaultLazy.Always()

とにかく、この構成トピックは非常に複雑で、マッピングをどのように正確に構成するかに依存します。 SQL コマンドが ORM によって生成されていることを確認するには、hHibernate SQL ログを参照することをお勧めしますlog4net

于 2012-07-18T08:16:03.600 に答える