我无法弄清楚这个基本的NHibernate查询我做错了什么

时间:2010-08-27 14:30:44

标签: c# nhibernate sqlite fluent-nhibernate

好的,我有一个班级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 */

编辑2

我尝试将数据库更改为SQL Server。在SQL Server中,一切正常。我想这是NHibernate如何连接到SQLite数据库的错误?目前,我可以使用SQL Server数据库进行测试,但出于速度原因,我希望将来能够使用In Memory SQLite数据库。

1 个答案:

答案 0 :(得分:1)

首先,您是否针对数据库运行查询?

其次,如果映射有问题,您可以尝试另一个CreateCriteria吗?然后你可以像下面那样使用jointype。只是为了确保我们在进一步行动之前已经尝试了所有基础知识:)

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;
}

第三,潜在的问题可能是你的表名周围有双引号。这表明存在映射问题。表名称不匹配或类似的东西。