2011-02-25 59 views
0

好吧,我找不到一個很好的例子,所以我可以更好地瞭解如何使用分離標準(假設這就是我想要的首先)。Nhibernate - 卡住與分離標準(asp.net mvc 1與nhibernate 2)c#

我有2個表格。 Placement and 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鍵位於第二個表中時。

有人可以指出我在正確的方向。從數據的角度來看,這似乎是一件容易的事情,希望我只是錯過了一些明顯的東西!

+0

你可以請你展示你的數據庫模型,對象和映射嗎? – Sly 2011-02-25 07:52:20

回答

0

我最終能夠使用上面修改的代碼。

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

隨着主管是我的Placement模型類的財產。

還要注意表達式已被限制條件半棄用。

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. 確保您使用的是屬性名稱而不是數據庫列名稱。
+0

太棒了 - 非常感謝:) – Jen 2011-02-27 22:33:30