2010-06-13 35 views
3
Father father = BL.GetFatherById(1); 
Product product = BL.GetByID(123); 

(father.Products[553] == product) 

product.delete = true; 

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

這是爲什麼?加載一個對象兩次並更改其中一個,另一個不會更改

不是他們連接?它是同一個對象。

+2

你能提供的BL類這兩種方法的內容? – 2010-06-13 09:22:01

+0

這似乎是一個問題,您的業務層(我假設BL代表業務層)是如何編寫的,但您尚未分享足夠的信息以提供比此更多的幫助。 +1給Yauheni的評論。 – 2010-06-13 10:20:39

回答

3

正如你可以在section 10.3 of the NHibernate reference manual中看到的那樣,數據庫標識和CLR對象標識每個會話都是等效的

因此​​將產生true當且僅當foobar連接到相同的會話,並映射到同一個數據庫行。使用==比較對象標識時要小心 - 操作符可能已經過載(但您通常應該知道這一點)。

因此,只要您保持在同一個會話中,無論您使用什麼對象查詢,都應該始終獲得相同的對象。你在使用多個會話嗎?也許是工作單元模式,並且您正在比較從不同工作單元返回的對象?

1

首先,讓我告訴你,你在做什麼是可怕的。什麼,這實際上意味着

father.Products[553] == product; 

除非你已經編寫了一個自定義集合,我懷疑你這樣做是沒有辦法,將工作。

  • 您是否正在從索引553中刪除產品是 ? 否
  • 您是否破壞親子關係 親子關係 553?否
  • 您是否正在與一個新產品建立與 父親的聯繫?否
  • 您是否正在建立從新產品到父親的關係 ?沒有

所以

  1. 揭露產品的IEnumerable,而不是名單
  2. 添加添加/刪除將要處理的關係syncronozation方法。

到這裏看看如何做到這一點(不考慮實際問題)

How to map it? HasOne x References

相關問題