2013-01-03 29 views
2

我有這樣的代碼:NHibernate.QueryException消息:重複協會路徑

if (pertinentDataExists) {   
    List<Entity> operatorList = new List<Operator>(); 
    List<Entity> newOperatorList = criteria.newOperatorList; 
    foreach (Operator operator in operatorList) 
    { 
     operatorList.Add(operator); 
    } 
    queryCriteria.CreateCriteria("OperatorList").Add(Restrictions.In("Operator", operatorList)); 
} 

再後來:

if (otherPertinentDataExists) { 
    Object[] objects = new Object[criteria.newRoleTypeList.Count];                             
    for (int = 0; i < criteria.RoleTypeList.Count; i++) {                      
     objects[i] = criteria.RoleTypeList[i].Id; 
    }                      
    queryCriteria.CreateCriteria("OperatorList").Add(Restrictions.In("Role", objects)); 
} 

這些工作分開就好了。但是,如果是這兩種情況下有標準添加到列表中的話,那麼我得到:

NHibernate.QueryException消息:重複協會路徑: OperatorList

如何添加限制對於Role如果條件已經創建?

+0

樣子,你可以檢查它是否已經與'GetCriteriaByPath( 「OperatorList」)存在' – dotjoe

回答

2

有兩種選擇。第一,如果可能的話(以同樣的方法是),創建標準和引用它們作爲一個局部變量:

var operatorListCriteria = queryCriteria.CreateCriteria("OperatorList"); 

if (myCondition1) 
{ 
    operatorListCriteria.Add(... 
} 
if (myCondition2) 
{ 
    operatorListCriteria.Add(... 
} 

第二,創建一個「別名」條件,然後,以後,任何地方,你可以找到他們與GetCriteriaByAlias(aliasPath)

var aliasPath = "OperatorListAlias"; 
var operatorListCriteria = queryCriteria.CreateCriteria("OperatorList", aliasPath); 
... 
// later find them by aliasPath 
var subCriteria = queryCriteria.GetCriteriaByAlias(aliasPath); 

注:另外,還要檢查GetCriteriaByPath(associationPath)

+0

我ñ ot確定你的意思是「a也檢查GetCriteriaByPath(associationPath)」我必須檢查aliasPath和assocationPath嗎?或者只檢查其中一個必要的? – numberwang

+0

我不太清楚:我想說,你也可以使用'GetCriteriaByPath',這是另一種方式來搜索現有的子標準。所以你可以使用它們('GetCriteriaByAlias'或'GetCriteriaByPath')......取決於哪一個更適合你 –

+0

謝謝,我現在工作。 – numberwang