NHibernate - простой запрос на соединение - PullRequest
2 голосов
/ 14 января 2011

Очень простой сценарий. У меня есть 2 класса: Проект и DataStructure . Класс Проект содержит список членов <<strong> DataStructure >. Моя цель - загрузить проект и все его структуры данных за один вызов.

public class Project
{
    public virtual string Id { get { } set { } }
    public virtual string Name { get { } set { } }
    public virtual ISet<DataStructure> DataStructures { get { } set { } }
}

public class DataStructure
{
    public virtual string Id { get { } set { } }
    public virtual string Name { get { } set { } }
    public virtual string Description { get { } set { } }
    public virtual Project Project { get { } set { } }
    public virtual IList<DataField> Fields { get { } set { } }
}

Обратите внимание, что DataStructure также содержит список класса DataField , но я не хочу загружать их сейчас. 1028 *

Отображение в беглом NHibernate:

public class ProjectMap : ClassMap<Project>
{
    public ProjectMap()
    {
        Table("PROJECTS");
        Id(x => x.Pk, "PK");
        Map(x => x.Id, "ID");
        Map(x => x.Name, "NAME");
        HasMany<DataStructure>(x => x.DataStructures).KeyColumn("FK_PROJECT");
    }
}

public class DataStructureMap : ClassMap<DataStructure>
{
    public DataStructureMap()
    {
        Table("DATA_STRUCTURES");
        Map(x => x.Id, "ID");
        Map(x => x.Name, "NAME");
        Map(x => x.Description, "DESCRIPTION");
        References<Project>(x => x.Project, "FK_PROJECT");
        HasMany<DataField>(x => x.Fields).KeyColumn("FK_DATA_STRUCTURE");
    }
}

Это мой запрос:

using (ISession session = SessionFactory.OpenSession())
{
    IQuery query = session.CreateQuery("from Project left join DataStructure");
    project = query.List<Project>();
}

Результатом является это исключение:

NHibernate.Hql.Ast.ANTLR.SemanticException: Path expected for join! [from Themis.DataEntities.Project left join DataStructure]

Нужно ли указывать поле для объединения? Разве это не выводится из отображений?

Note1 - Таблица PROJECTS содержит одну строку Project , поэтому нет необходимости искать конкретную строку.

Примечание 2 - Я проверил правильность настроек NHibernate, успешно загрузив только Project .

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Для всех, кто интересуется, я нашел ответ на nhusers:

IQuery query = session.CreateQuery("from Project as pr left join pr.DataStructures")
1 голос
/ 14 января 2011

Ваш запрос должен быть "from Project left join Project.Fields".Project.DataStructures - это путь, который NH ожидает увидеть.Помните, что он ориентирован на объекты, а не на таблицы, поэтому большую часть времени даже ваши запросы работают с объектами.

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