2012-12-07 31 views
1

從NHibernate的文檔:與ID()實體使用級聯GeneratedBy.Assigned()

由於其固有的性質,使用這種發電機無法通過的Isession的SaveOrUpdate保存 實體()方法。相反,如果需要保存對象或者通過調用 ISession的Save()或Update()方法更新 ,則必須明確指定給NHibernate。

OK,所以當這些實體是另一個實體的孩子,你想,這樣當父保存它的孩子堅持過使用級聯,我們怎麼能因爲我們應該選擇SaveUpdate

我是否應該把我的骨髓根除掉並開始拯救個別孩子?在框架中覆蓋這個有多難?當我離開垃圾箱時,我不應該關掉燈,它應該是自動的,我認爲。

+0

好一個!期待任何答案... –

+0

Id如何分配?你可能實現和idgenerator,並有未保存的值集? – Firo

+0

我有一個導入系統,其中源文件具有預定義的GUID,可能存在也可能不存在於目標數據庫中..所以我在代碼中分配ID,首先檢查數據庫中是否存在,這導致我決定保存還是更新......對我來說,對於我來說,期望NH執行此存在檢查我是否分配了id的實體似乎並不合理......即SaveOrUpdate –

回答

0

這是可能的,有輕微的,並不完全令人反感的副作用。

如果我們使用VersionUnsavedValue配置,我們可以再次使用SaveOrUpdate(),我們的實體和級聯按預期工作。

但是,由於版本值是在數據庫端處理的,NH必須進行第二次調用來檢索最新版本(在我的情況下是時間戳)。

我更喜歡聚合根處理孩子的節省,所以它適用於我。

...

public virtual byte[] Version { get; set; } 

...

mapping.Version(m => m.Version) 
.UnsavedValue(null) 
.CustomSqlType("timestamp") 
.CustomType("BinaryBlob") 
.Generated.Always();