【问题标题】:Nhibernate - stuck with detached criteria (asp.net mvc 1 with nhibernate 2) c#Nhibernate - 坚持分离标准(asp.net mvc 1 和 nhibernate 2)c#
【发布时间】:2011-02-25 05:51:50
【问题描述】:

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

我有 2 张桌子。 Placement和PlacementSupervisor

我的 PlacementSupervisor 表有一个 PlacementID 的 FK,它与 Placement.PlacementID 相关——尽管我的休眠模型类有 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 是一个字符串。 其次,我不明白如何实现我想要做的,只是尝试了各种投影组合、属性别名和子查询选项......因为我不明白我应该如何加入另一个表/entity 当 FK 键位于第二个表中时。

谁能指出我正确的方向。从数据的角度来看,这似乎是一件很容易的事情,希望我只是遗漏了一些明显的东西!

【问题讨论】:

  • 能否请您展示您的数据库模型、对象和映射?

标签: c# nhibernate nhibernate-criteria


【解决方案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 列名称。

【讨论】:

    【解决方案2】:

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

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

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

    另请注意,Expressions 已被 Restrictions 半弃用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      相关资源
      最近更新 更多