加载一个对象两次并更改其中一个,另一个没有改变

时间:2010-06-13 09:09:34

标签: c# nhibernate

Father father = BL.GetFatherById(1);  
Product product = BL.GetByID(123);  

(father.Products[553] == product)  

product.delete = true;  

father.Products[553].delete == false !!??   

为什么?

他们没有连接?它是同一个对象。

2 个答案:

答案 0 :(得分:3)

正如您可以阅读section 10.3 of the NHibernate reference manual 数据库标识和CLR对象标识在每个会话中是等效的

因此Object.ReferenceEquals(foo, bar) true会产生foo当且仅当bar==附加到同一会话并映射到同一数据库行时。使用{{1}}比较对象标识时要小心 - 运算符可能已经过载(但通常应该知道)。

因此,只要您保持在同一会话中,无论您使用哪个查询对象,都应始终获取相同的对象。你在使用多个会话吗?也许是一个工作单元模式,你正在比较从不同工作单元返回的对象?

答案 1 :(得分:1)

首先,让我告诉你,你所做的是可怕的。这实际意味着什么

father.Products[553] == product;

除非你编写了一个自定义集合,我怀疑你做了,但是没有办法可行。

  • 您是否正在删除产品 已经在收集的索引553? 否
  • 你打破了这段关系吗? 父亲和产品之间的索引 553?否
  • 你是否正在与a建立关系? 父亲用新产品?否
  • 你在建立关系吗? 从新产品到父亲?否

所以

  1. 将产品公开为IEnumerable而非列表
  2. 添加将处理关系同步的添加/删除方法。
  3. 看看这里怎么做(忽略实际问题)

    How to map it? HasOne x References