2010-02-15 45 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