2010-02-15 84 views
5

問我看過所有相關的帖子就這個話題NHibernate的許多一對多使用標準API

我也看過這篇博客之前查詢:http://ayende.com/Blog/archive/2007/12/23/NHiberante-Querying-Many-To-Many-associations-using-the-Criteria-API.aspx

我的團隊和我有會員,有不少一對多它們之間的關係

基本上是:會員 - > MemberTeam < - 團隊

隨着我的查詢我試圖讓屬於同一隊的成員查詢所有成員(包括查詢會員)

我創建使用的關注FluentHibernate我的表:

TeamMap代碼:

Id(x => x.ID).GeneratedBy.GuidComb().UnsavedValue("00000000-0000-0000-0000-000000000000"); 

HasManyToMany(x => x.Members) 
    .Table("MemberTeam") 
    .ChildKeyColumn("TeamID") 
    .ParentKeyColumn("MemberID"); 

MemberMap代碼:

Id(x => x.ID).GeneratedBy.GuidComb().UnsavedValue("00000000-0000-0000-0000-000000000000"); 

HasManyToMany(x => x.Teams) 
    .Table("MemberTeam") 
    .ChildKeyColumn("MemberID") 
    .ParentKeyColumn("TeamID"); 

我做我的查詢的代碼是:

DetachedCriteria dCriteria = DetachedCriteria.For(typeof(Team), "team") 
    .SetProjection(Projections.Id()) 
    .Add(Property.ForName("team.ID").EqProperty("mt.ID")); 

ICriteria criteria = Session.CreateCriteria(typeof (Member), "member") 
    .CreateAlias("Teams", "mt") 
    .Add(Subqueries.Exists(dCriteria)) 
    .Add(Restrictions.Eq("mt.MemberID", new Guid(memberID))); 

IList<Member> list = criteria.List<Member>(); 

我知道我做錯了什麼,但我不明白它的

任何幫助,將不勝感激

非常感謝你!

P.S.我的地圖接縫很好,我可以節省物體!

回答

4

通過爲Teams路徑調用CreateAlias,NHibernate將爲您加入相應的表格。有沒有必要做的會員ID的子查詢:

var members = session 
    .CreateCriteria<Member>("member") 
    .CreateAlias("Teams", "mt") 
    .List<Member>(); 

但是,你甚至不使用別名,所以你可能只是喜歡急於拿到球隊:

var members = session 
    .CreateCriteria<Member>("member") 
    .SetFetchMode("Teams", FetchMode.Eager) 
    .List<Member>(); 

這樣做會確保在訪問每個MemberTeams集合時不會再次訪問數據庫。

+0

謝謝你...想了幾個小時後,我得到了同樣的答案:) – 2010-02-16 11:40:16