Nhibernate-遵守分离的标准(asp.net mvc 1和Nhibernate 2)c#

Nhibernate-遵守分离的标准(asp.net mvc 1和Nhibernate 2)c#,c#,nhibernate,nhibernate-criteria,C#,Nhibernate,Nhibernate Criteria,好的,我找不到一个很好的例子,所以我可以更好地理解如何使用分离的标准(假设这是我首先要使用的) 我有两张桌子。 就业和就业主管 我的PlacementSupervisor表有一个与Placement.PlacementID相关的PlacementID的FK-尽管我的nhibernate模型类有PlacementSupervisor。放置(而不是专门指定放置ID的属性-不确定这是否重要) 我想做的是-如果通过了主管ID的值,我想用该主管ID限制放置 已尝试: ICriteria query = m

好的,我找不到一个很好的例子,所以我可以更好地理解如何使用分离的标准(假设这是我首先要使用的)

我有两张桌子。 就业和就业主管

我的PlacementSupervisor表有一个与Placement.PlacementID相关的PlacementID的FK-尽管我的nhibernate模型类有PlacementSupervisor。放置(而不是专门指定放置ID的属性-不确定这是否重要)

我想做的是-如果通过了主管ID的值,我想用该主管ID限制放置

已尝试:

ICriteria query = m_PlacementRepository.QueryAlias("p")
....
    if (criteria.SupervisorId > 0 && !string.IsNullOrEmpty(criteria.SupervisorTypeId))
                {

                    DetachedCriteria entityQuery = DetachedCriteria.For<PlacementSupervisor>("sup")
                         .Add(Restrictions.And(
                                       Restrictions.Eq("sup.supervisorId", criteria.SupervisorId),
                                      Restrictions.Eq("sup.supervisorTypeId", criteria.SupervisorTypeId)
                                   ))
                    .SetProjection(Projections.ProjectionList()
                                       .AddPropertyAlias("Placement.PlacementId", "PlacementId")
                                       );
                    query.Add(Subqueries.PropertyIn("p.PlacementId", entityQuery));
                }
ICriteria query=m_PlacementRepository.QueryAlias(“p”)
....
if(criteria.SupervisorId>0&!string.IsNullOrEmpty(criteria.SupervisorTypeId))
{
DetachedCriteria entityQuery=DetachedCriteria.For(“sup”)
.添加(限制)和(
限制条件.Eq(“sup.supervisorId”,criteria.supervisorId),
Restrictions.Eq(“sup.supervisorTypeId”,criteria.supervisorTypeId)
))
.SetProjection(Projections.ProjectionList()项目)
.AddPropertyAlias(“Placement.PlacementId”、“PlacementId”)
);
Add(subquerys.PropertyIn(“p.PlacementId”,entityQuery));
}
这就给了我一个错误: 找不到符合以下条件的信息提供程序:(sup.supervisorId=5和sup.supervisorTypeId=U)

首先,supervisorTypeId是一个字符串。 其次,我不知道如何实现我正在尝试的目标,我只是尝试了各种投影、属性别名和子查询选项的组合。因为我不知道当FK键位于第二个表中时,我应该如何连接到另一个表/实体

有人能给我指一下正确的方向吗。从数据的角度来看,这似乎是一件很容易做到的事情,希望我只是错过了一些显而易见的事情

通常,如果您不想在会话中立即使用DeteacheCriterias,那么您可以使用DeteacheCriterias,因此听起来您并不真正需要它

上面的链接(第13.4节)给出了一个示例(我已对其进行了修改,以符合您的条款):

其他一些注意事项:

  • 我不会担心FK的。只要映射了关系,NH就可以知道如何进行连接
  • 属性名是区分大小写的,我想也可以用“sup.SupervisorId”试试
  • 确保使用的是属性名,而不是db列名
    我最终能够使用上面修改过的代码

      query.CreateCriteria("Supervisors")  
          .Add(Restrictions.Eq("SupervisorId", (int)criteria.SupervisorId))
          .Add(Restrictions.Eq("SupervisorType.SupervisorTypeId", criteria.SupervisorTypeId));
    
    在我的实习示范班上,导师是我的财产


    还请注意,由于受到限制,表达式已被半弃用。

    能否显示您的数据库模型、对象和映射?
      query.CreateCriteria("Supervisors")  
          .Add(Restrictions.Eq("SupervisorId", (int)criteria.SupervisorId))
          .Add(Restrictions.Eq("SupervisorType.SupervisorTypeId", criteria.SupervisorTypeId));