Беглый NHibernate, отображающий CompositeId и запрашивающий с помощью SetProjection - PullRequest
2 голосов
/ 13 июля 2009

У меня есть две таблицы (Section и SectionList), которые связаны между собой таблицей «многие ко многим» (членство). Поскольку в таблице «многие ко многим» есть дополнительное свойство, я должен разбить его на собственную сущность:

    public MembershipMap()
    {
        UseCompositeId()
            .WithKeyReference(x => x.Section, "SectionId")
            .WithKeyReference(x => x.SectionList, "SectionList"); 
        Map(x => x.Status);
    }

И SectionList отображается следующим образом:

    public SectionListMap()
    {
        Id(x => x.Id)
            .WithUnsavedValue(0);

        HasMany(x => x.Memberships)
            .Inverse()
            .Cascade.AllDeleteOrphan();
    }

Кажется, что отношения работают нормально, за исключением случаев, когда я пытаюсь выполнить расширенные запросы к нему. Например, вот запрос, который захватывает только определенные поля и преобразует их в DTO:

    var criteria = DetachedCriteria.For<CustomSectionListMembership>()
            .CreateAlias("SectionList", "sl")
            .CreateAlias("Section", "s")
            .CreateAlias("s.Website", "w")
            .CreateAlias("w.Publisher", "p")
            .SetProjection(Projections.ProjectionList()
                .Add(Projections.Property("s.Id"), "SectionId") //add projections for every propery you want returned
                .Add(Projections.Property("s.Name"), "SectionName") // mapping entity name -> DTO name
                .Add(Projections.Property("w.Id"), "WebsiteId")
                .Add(Projections.Property("w.Name"), "WebsiteName")
                .Add(Projections.Property("p.Id"), "PublisherId")
                .Add(Projections.Property("p.Name"), "PublisherName")
                .Add(Projections.Property("Status")))
            .Add(Expression.Eq("sl.Id", listId))
            .SetResultTransformer(Transformers.AliasToBean(typeof(MembershipDTO))); //transform to the DTO
    var membership = repository.FindAll(criteria);

Этот запрос содержит ошибку «не удалось выполнить запрос», поскольку в генерируемом запросе полностью отсутствуют внутренние объединения, которые должны были быть созданы вызовами CreateAlias:

SELECT s2_.SectionId               as y0_,
   s2_.Name                    as y1_,
   w3_.WebsiteId               as y2_,
   w3_.Name                    as y3_,
   p4_.PublisherId             as y4_,
   p4_.Name                    as y5_,
   this_.Status as y6_ FROM Membership this_ WHERE csl1_.ListId = 6923 /* @p0 */

В чем может быть проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...