0

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

myListOfTcontains someT,并且myListOfT[0]似乎是someT(我可以使用 Visual Studio“spy”看到它)。哈希码是相同的。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>)

休眠配置:

    <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)。

4

1 回答 1

0

确保两者Equals()GetHashCode()正确实施User

于 2011-03-21T15:27:18.640 回答