重命名NHibernate标准

时间:2014-11-22 03:18:41

标签: c# nhibernate fluent-nhibernate

我尝试多次连接别名,但这取决于它应该这样做的次数。

Employee employeeAlias = null;
Thing thingAlias = null;
var names = string[] {"A", "B", "C", "D", "E"} // number of values could vary
for(int i = 0; i < names.Length ; i++)
{
   queryOver
       .JoinAlias(() => employeeAlias.Things, 
                  () => thingAlias,
                  JoinType.LeftOuterJoin, 
                  Restrictions.Eq(Projections.Property(() => thingAlias.Name, 
                                  names[i]));
}

然而,在执行时,NHibernate会抛出错误说:

NHibernate.QueryException: duplicate alias: thingAlias ---> System.ArgumentException: An item with the same key has already been added

有没有办法让NHibernate加入一个具有指定名称的别名,以便它不会重用变量的名称?

谢谢你们。自昨天以来,这一直是我的问题,我无法找到合适的解决方案。

PS:

我试图做这样的事情:

SELECT * FROM Employee e
LEFT OUTER JOIN Thing t on e.Id = t.EmployeedId AND t.Name = "A"
LEFT OUTER JOIN Thing t on e.Id = t.EmployeedId AND t.Name = "B"

2 个答案:

答案 0 :(得分:1)

你想要达到的目标是不可能的。每个关系(many-to-oneone-to-many)只能使用一次。

要支持此声明,请在此处查看:CriteriaQueryTranslator.cs

private void CreateAssociationPathCriteriaMap()
{
    foreach (CriteriaImpl.Subcriteria crit in rootCriteria.IterateSubcriteria())
    {
        string wholeAssociationPath = GetWholeAssociationPath(crit);
        try
        {
            associationPathCriteriaMap.Add(wholeAssociationPath, crit);
        }
        catch (ArgumentException ae)
        {
            throw new QueryException("duplicate association path: "
                                    + wholeAssociationPath, ae);
        }

因此,我们可以在这里看到,无论别名如何,最后,所有关联关系(JOINS)都会添加到associationPathCriteriaMap,即IDictionary<string, ICriteria>

这意味着,现在有了如何在游戏中使用两个相同的键...

答案 1 :(得分:0)

我没有尝试过,但我认为不是使用for-loopRestrictions.Eq,我们可以(不确定,但如果您没有尝试过)使用{{ 1}}喜欢 -

Restrictions.In