摘要:[Nhibernate]物件生命週期1
生命週期 名詞:
Transient(暫態、未佔位):新的資料,不受Nhibernate託管,不存在一級暫存區中。憤青。
Detached(未依附、已佔未):被修改的資料,存在一級暫存區中,已被Nhibernate託管。外出的小孩逛街的小孩,住在某個家中。
Persistent(永續、佔位):儲存的資料,存在一級暫存區中,已被Nhibernate託管。買完東西,回家的小孩。
簡述:
在Nhibernate中,只要有Query後的資料都會存在暫存區中,每筆資料(物件),都指向唯一的位置(實體,意指:切勿輕易的編輯Query後所拿到的資料實體,因為等同操作DB)。做資料SaveOrUpdate會比對暫存區資料(與Persistent比較,不包含Detached)將異動的資料寫入DB,並自動更新暫存區(Persistent)。
所以資料(物件)在使用時請記得DTO(將Nhibernate資料轉成使用物件),勿將資料傳到前端(或只唯讀),才不會資料被修改導致暫存區關聯混亂,並造成回寫實關聯性錯誤回寫失敗。
註: 若重新Query:在原暫存區中的實體,將指向新的Query暫存,意味著原本獲取的資料(物件),將不再指向資料(物件)位置(實體),所以在Query後請記得刷新擁有實體的物件。若是以DB的角度來看還是同一份資料。DB(key)跟C#(物件參考位置)是不同。