【发布时间】:2012-01-10 18:08:09
【问题描述】:
我有一个不覆盖任何相等成员\运算符的实体。
当比较它们的两个代理时(我从Nhibernate session 得到它们),结果会根据相等方法发生变化:
- ReferenceEquals(first, second) - false。
- 第一个 == 第二个 - 错误
- 等于(第一,第二) - 真。
这更奇怪,因为它们都存在于同一个会话上下文中并且根据Nhibernate docs:
NHibernate 只保证身份( a == b ,默认 在单个 ISession 中实现 Equals())!`
还有:
该实例当前与持久性上下文相关联。它 有一个持久的身份(主键值),也许,一个 数据库中对应的行。对于特定的持久性 在上下文中,NHibernate 保证持久标识是等价的 到 CLR 标识(对象的内存位置)。
那么为什么不是所有的相等方法都返回 true 呢?
更新:
我通过这种方式获取实体,查询 ChildEntity 的会话并使用 Linq 的 select 获取父实体,类似于:
var childs = session.Query<Child>();
var parents = childs.Select(x => x.ParentEntity).ToList();
【问题讨论】:
-
您的问题与您的标题不符 - 您的示例显示 == 和 ReferenceEquals 的行为方式相同。
-
我的猜测是两个单独的代理“指向”同一个实例,因此代理不满足引用相等,但 Equals 方法被编组,因此它们被报告为相等。
-
如何从会话中获取这两个对象?以我的经验, == 平等可靠地工作。所以我的猜测是,要么 Nhibernate 认为这两个实体实际上代表不同的数据库行,要么它们属于不同的会话。
标签: c# .net nhibernate orm proxy