好的,我有一个班级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数据库。
答案 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;
}
第三,潜在的问题可能是你的表名周围有双引号。这表明存在映射问题。表名称不匹配或类似的东西。