Я не могу понять, что я делаю не так с этим основным запросом NHibernate - PullRequest
1 голос
/ 27 августа 2010

Хорошо, у меня есть класс, Company

public class Company
{
    public virtual int Id { get; set; }
    public virtual IList<Role> Roles { get; set; }
}

И еще один класс, Role

public class Role
{
    public virtual int Id { get; set; }
    public virtual Company Company { get; set; }
    public virtual RoleLevel RoleLevel { get; set; }
}

Я использую автообращения Fluent, ничего особенного не происходит.

У меня есть этот метод:

private RoleLevel GetRole(int companyId)
{
    var allRoles = Session.CreateCriteria<Role>().List<Role>();

    var role = Session.CreateCriteria<Role>()
        .CreateAlias(NameOf<Role>.Property(r => r.Company), "c")
        .Add(Restrictions.Eq("c.Id", companyId))
        .UniqueResult<Role>();

    return (role == null) ? RoleLevel.Restricted : role.RoleLevel;
}

companyId передается как 102. Если я проверяю массив allRoles, один из них относится к Компании # 102.Но запрос, который должен вернуть один Role, возвращает null.

Что я делаю не так?

РЕДАКТИРОВАТЬ 1

По запросу, вот запрос выполняется в соответствии с NHProf:

SELECT this_.Id         as Id75_1_,
       this_.Version    as Version75_1_,
       this_.RoleLevel  as RoleLevel75_1_,
       this_.DbDate     as DbDate75_1_,
       this_.Account_id as Account5_75_1_,
       this_.Company_id as Company6_75_1_,
       c1_.Id           as Id71_0_,
       c1_.Version      as Version71_0_,
       c1_.Name         as Name71_0_,
       c1_.OnyxAlias    as OnyxAlias71_0_,
       c1_.DbDate       as DbDate71_0_,
       c1_.Parent_Id    as Parent6_71_0_
FROM   "Role" this_
       inner join "Company" c1_
         on this_.Company_id = c1_.Id
WHERE  c1_.Id = 102 /* @p0 */

EDIT 2

Я попытался изменить базу данных на SQL Server.В SQL Server все это работает.Я предполагаю, что это ошибка с тем, как NHibernate соединяется с базами данных SQLite?Пока я могу использовать БД SQL Server для тестирования, но я бы хотел в будущем использовать БД SQLite в памяти по соображениям скорости.

1 Ответ

1 голос
/ 27 августа 2010

Прежде всего, вы запустили запрос к базе данных?

Во-вторых, если с отображением что-то не так, не могли бы вы попробовать другой CreateCriteria? Затем вы можете указать тип соединения, как показано ниже. Просто чтобы убедиться, что мы попробовали все основы, прежде чем двигаться дальше:)

private RoleLevel GetRole(int companyId)
{
    var allRoles = Session.CreateCriteria<Role>().List<Role>();

    var role = Session.CreateCriteria<Role>("r")
        .CreateCriteria("Company", "c", JoinType.LeftOuterJoin)
        .Add(Restrictions.Eq("c.Id", companyId))
        .UniqueResult<Role>();

    return (role == null) ? RoleLevel.Restricted : role.RoleLevel;
}

В-третьих, потенциальная проблема может заключаться в двойных кавычках вокруг имен таблиц. Это указывает на проблему с отображением. Несовпадение имени таблицы или чего-то подобного.

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