NHibernate 3和城堡代理:myList.Contains坏了

时间:2011-03-15 15:57:50

标签: nhibernate lazy-loading castle

我正在尝试将C#.NET 3.5项目从NH 1.2升级到NH 3.1。我很难用myListOfT.contains(someT)

myListOfT包含someT,而myListOfT[0]似乎是someT(我可以通过Visual Studio“间谍”看到它)。 HashCodes是一样的。 myListOfT[0]someT都是Castle.Proxies.T ...

我的代码和NH 3.1有什么问题?


让我们说我想知道我有些用户属于工作场所或属于儿童用户。

    public bool UserBelongToWorkplace(Workplace wp, User u)
    {
        if (wp.Users.Contains(u)) return true;

        foreach (Workplace subWp in wp.Workplaces)
        {
            return UserBelongToWorkplace(subWp, u);
        }
    }

在此背景下:wp.Users : ReadOnlyCollection<User> (hides IList<Users>)

Nhibernate配置:

    <property name="cache.use_second_level_cache">true</property>

    <property name="proxyfactory.factory_class">
      NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle
    </property>

在运行时,即使工作区确实包含用户,该函数也始终返回false

使用调试器/跟踪我可以检查wp.Users [0] == u(相同的Id,相同的HashCode)。这两个对象都是代理的。在升级到Nhibernate 3.1之前它工作正常。

我很确定它与延迟加载/代理有关,因为我们已经遇到了一些问题,但它涉及类型比较(例如CProxy_User和User)。

1 个答案:

答案 0 :(得分:0)

确保Equals()

正确实施GetHashCode()User