2013-07-19 112 views
0

我想从NHibernate中获取一个只读对象的集合,其中所有的属性来自一个表(Answers),除了一个来自另一个属性表(Questions)以多对一的关系。它是两个表的事实是我想隐藏的实现细节,所以我希望存储库返回一个合理的聚合。麻烦的是,这需要我有两个类,每个表一个,NHibernate返回,然后我必须选择/映射到我的存储库返回的第三个类。这感觉有点垃圾,所以我希望有一个映射为我加入两个表,但将所有列映射到一个类。我的映射是这样的: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看起来很完美,准确地返回我想要的东西,但是当有加盟的问题表在同一行多个答案,NHibernate的似乎把它们映射到对象错误地 - 我得到了正确数量的结果,但所有具有常见问题的答案都与该问题的sql结果中的第一行保持一致。

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

回答

1

因为Join意思就是这样。它假定两个表之间的一对一关联不是这种情况。

而不是一个映射实体的我会prefere一个在飞行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();