0

我正在尝试从 NHibernate 获取一组只读对象,其中所有属性都来自单个表 ( Answers),但一个属性来自另一个表 ( Questions) 中的多对一关系除外。它是两个表的事实是我想隐藏的实现细节,所以我希望存储库返回一个合理的聚合。问题是这需要我有两个类,每个表一个,NHibernate 返回,然后我必须选择/映射到我的存储库返回的第三个类。这感觉有点垃圾,所以我希望有一个映射为我连接两个表,但将所有列映射到一个类。我的映射如下所示:

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 看起来很完美,并且完全返回了我想要的,但是当有多个 Answers 连接到 Questions 表中的同一行时,NHibernate 似乎错误地将它们映射到对象 - 我得到了正确数量的结果,但是所有具有共同问题的答案与该问题的 sql 结果中的第一行相结合。

我这样做对吗?NH 正在生成正确的 SQL,那么为什么它构建我的对象是错误的?

4

1 回答 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 回答