7

私はこのようなクラスを持っています:

[Class(Table = "SessionReportSummaries", Mutable = false)]
public class SessionReportSummaries
{        
    [ManyToOne(Column = "ClientId", Fetch = FetchMode.Join)]
    public Client Client { get; private set; }

    [ManyToOne(Column = "ClientId", Fetch = FetchMode.Join)]
    public ClientReportSummary ClientReportSummary { get; private set; }
}

SessionReportSummariesビューにはClientId列があり、この列を使用してClientオブジェクトとClientReportSummaryオブジェクトの両方を結合しようとしています。

残念ながら、NHibernateはクラスで定義された最初のものにのみ参加したいので、常に2番目のものに対してSELECTを実行します。したがって、このシナリオでは、NHibernateは最初に次のコマンドでデータベースにクエリを実行します。

SELECT {stuff} FROM SessionReportSummaries ... left outer join Clients on this.ClientId=Clients.Id ...

(他の多くの結合を使用)、次にこれらのN:

SELECT {stuff} FROM ClientReportSummary WHERE ClientReportSummary.ClientId = '{id goes here}'

問題のNクライアントごとに1つ。その結果、パフォーマンスが低下します。

ClientオブジェクトとClientReportSummaryオブジェクトの位置を入れ替えると、NHibernateは代わりにClientReportSummaryをSessionReportSummariesオブジェクトに結合し、Clientオブジェクトごとに選択を実行します。

NHibernateにこれらの両方の参加を実行させる方法を知っている人はいますか?

4

1 に答える 1

2

NHibernateは、1回のクエリで同じ列マッピングを1つだけ取得します。したがって、列属性を介して値「ClientId」にマップされる2つの異なるエンティティがあるためです。

  • [ManyToOne(Column = "ClientId"、Fetch = FetchMode.Join)]
  • [ManyToOne(Column = "ClientId"、Fetch = FetchMode.Join)]

この場合、列マッピングの一意性は認められません。また、両方のエンティティが適用されるフォームを挿入または更新すると、損傷が発生する可能性があります。しかし、私たちはトリックを使うことができます:FORMULAマッピング

[Class(Table = "SessionReportSummaries", Mutable = false)]
public class SessionReportSummaries
{        
    [ManyToOne(Column = "ClientId", Fetch = FetchMode.Join)]
    public Client Client { get; private set; }

    [ManyToOne(Formula = "ClientId", Fetch = FetchMode.Join)]
    public ClientReportSummary ClientReportSummary { get; private set; }
}

これで、NHibernateは1つの列マッピングを実際の関係として取り、2番目(で定義formula)を別の関係として評価します。これで、単一のselectステートメントが使用されます

formula(の代わりに)マッピングに使用される場合は常に、およびcolumnとしてマークする必要があります。SELECTのためだけに必要です。(それ以外の場合は、異なるClientIdを持つClientとClientReportSummaryをSessionReportSummariesエンティティに追加できます-これは例外に違反します...insert="false"update="false"

2番目のアプローチは、1対1のマッピングである可能性があります。この場合、「ClientId」は3つのテーブルすべてで実際に同じであると予想されますが、これは別のトピックです。

于 2012-11-09T09:40:23.113 に答える