Прежде, чем спросить я посмотрел на все соответствующие сообщения по этой теме
Я также считал это сообщение в блоге: http://ayende.com/Blog/archive/2007/12/23/NHiberante-Querying-Many-To-Many-associations-using-the-Criteria-API.aspx
У меня есть Команды, и у меня есть участники, существуют many-many отношения между ними
В основном: участник-> 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 list = criteria.List();
Я знаю, что делаю что-то не так, но я не могу понять что это
Любая справка ценилась бы
Большое спасибо!
P.S. Мои швы карты, чтобы быть прекрасным, я могу сохранить объекты очень хорошо!
Благодаря вызову CreateAlias
для пути Teams
, NHibernate присоединится к соответствующим таблицам за вас. Нет необходимости делать подзапрос для идентификаторов участников:
var members = session
.CreateCriteria<Member>("member")
.CreateAlias("Teams", "mt")
.List<Member>();
Однако вы даже не используете псевдоним, поэтому вы можете просто с нетерпением получить команды:
var members = session
.CreateCriteria<Member>("member")
.SetFetchMode("Teams", FetchMode.Eager)
.List<Member>();
Это гарантирует, что вы больше не попадете в базу данных при доступе к каждой коллекции Участника
Команды
.