2013-07-19 148 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();