Nhibernate - 坚持分离标准(asp.net mvc 1与nhibernate 2)c#

时间:2011-02-25 05:51:50

标签: c# nhibernate nhibernate-criteria

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

我有2张桌子。 Placement和PlacementSupervisor

我的PlacementSupervisor表有一个PlacementID的FK,它与Placement.PlacementID有关 - 虽然我的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));
                }

这只是给我错误: 找不到匹配的条件信息提供者:(sup.supervisorId = 5和sup.supervisorTypeId = U)

首先supervisorTypeId是一个字符串。 其次我不明白如何实现我正在尝试做的事情,所以刚刚尝试了各种投影组合,以及属性别名和子查询选项......我不知道我应该如何加入另一个表/ FK键位于第二个表中的实体。

有人能指出我正确的方向吗?从数据的角度来看,这似乎是一件容易的事情,希望我只是错过了一些明显的东西!!

2 个答案:

答案 0 :(得分:1)

This might help. It's a good overview of the criteria api by Fabio Maulo

一般情况下,如果您不想在会话中立即使用它,请使用DeteachedCriterias,因此听起来并不像您真正需要的那样。

以上链接(第13.4节)给出了一个示例(我已修改为符合您的条款):

IList placements = sess.CreateCriteria(typeof(Placement))
                 .CreateAlias("PlacementSupervisor", "sup")
                 .Add( Expression.EqProperty("sup.supervisorId", criteria.SupervisorId") )
                 .Add( Expression.EqProperty("sup.supervisorTypeId", criteria.SupervisorTypeId) )
                 .List();

其他几点说明:

  1. 我不担心FK的。只要您已经映射了这种关系,NH就可以找出如何进行连接。
  2. 属性名称区分大小写我认为也可以尝试使用“sup.SupervisorId”。
  3. 确保您使用的是属性名称,而不是db列名称。

答案 1 :(得分:0)

我最终能够使用上面修改过的代码。

  query.CreateCriteria("Supervisors")  
      .Add(Restrictions.Eq("SupervisorId", (int)criteria.SupervisorId))
      .Add(Restrictions.Eq("SupervisorType.SupervisorTypeId", criteria.SupervisorTypeId));

Supervisors是我的Placement模型类的属性。

另请注意,表达式已被“限制”半推荐使用。

相关问题