0

NHibernate から読み取り専用オブジェクトのコレクションを取得しようとしています。すべてのプロパティは単一のテーブル ( Answers) から取得されますが、1 つのプロパティは別のテーブル ( Questions) から多対 1 の関係で取得されます。それが 2 つのテーブルであるという事実は、私が隠したい実装の詳細であるため、リポジトリが賢明な集計を返すようにしたいと考えています。問題は、NHibernate が返す各テーブルに 1 つずつ、2 つのクラスが必要であり、リポジトリが返す 3 番目のクラスにそれを選択/マップする必要があることです。これは少しばかげているので、代わりに、2 つのテーブルを結合し、すべての列を 1 つのクラスにマップするマッピングが必要でした。私のマッピングは次のようになります。

public QuestionAnswerMap()
{
    ReadOnly();
    Table("Question");

    Id(x => x.Id).Column("questionId").GeneratedBy.Identity();
    Map(x => x.AnswerShortCode).Column("AnswerShortCode");

    Join("Answers", join =>
        {
            join.Fetch.Join();
            join.KeyColumn("questionId").Inverse();
            join.Map(x => x.QuestionId).Column("QuestionId");
            join.Map(x => x.AnswerId).Column("AnswerId");
            join.Map(x => x.MemberId).Column("MemberId");
        });
 }

これが生成する SQL は完璧に見え、私が望むものを正確に返しますが、質問テーブルの同じ行に結合する複数の回答がある場合、NHibernate はそれらをオブジェクトに間違ってマップしているようです - 私は正しい数の結果を取得しますが、すべて共通の質問を持つ回答は、その質問の sql 結果の最初の行に含まれています。

私はこれを正しい方法でやっていますか?NH は適切な SQL を生成しているのに、オブジェクトを間違って構築するのはなぜですか?

4

1 に答える 1

1

Join はこのように意図されていたからです。2 つのテーブル間の 1 対 1 の関連付けを前提としていますが、そうではありません。

マップされたエンティティの代わりに、私はこれのためにオンザフライのDtoを好みます:

var query = session.Query<Answer>()
    .Where(answer => ...)
    .Select(answer => new QuestionAnswer
    {
        QuestionId = answer.Question.Id,
        AnswerShortCode = answer.Question.AnswerShortCode,
        AnswerId = answer.Id,
        MemberId = answer.MemberId,
    });


return query.ToList();
于 2013-07-24T09:47:16.140 に答える