2009-09-18 103 views
1

這個問題有點愚蠢,但我仍然不明白處理沖洗的最佳方式。在NHibernate中沖洗

我遷移現有的代碼庫,其中包含類似下面的很多代碼:

private void btnSave_Click() 
{ 
    SaveForm(); 
    ReloadList(); 
} 

private void SaveForm() 
{ 
    var foo = FooRepository.Get(_editingFooId); 

    foo.Name = txtName.Text; 

    FooRepository.Save(foo); 
} 

private void ReloadList() 
{ 
    fooRepeater.DataSource = FooRepository.LoadAll(); 
    fooRepeater.DataBind(); 
} 

現在,我改變了FooRepository NHibernate的,我應該怎麼用的FooRepository.Save方法?實體保存時,FooRepository是否應該始終刷新會話?

回答

3

我不知道如果我理解你的問題,但在這裏就是我的想法:

想想「把對象的會話」,而不是「獲取和存儲數據」。 NH將在沒有任何特殊呼叫的情況下將所有新的和更改的對象存儲在會話中。

考慮一下這個場景:從任何查詢數據庫

  • 獲取數據:

    數據的變化。實體現在在NH會話中

  • 通過更改屬性值更改實體
  • 提交事務。更改將刷新並存儲到數據庫。

創建一個新的對象:

  • 調用構造函數調用「保存」以創建新的對象
  • 其存儲到數據庫中。現在在會議中。
  • 您仍然可以在保存後更改對象
  • 提交更改。最新的狀態將被存儲到數據庫中。

如果您使用分離的實體,還需要Update或SaveOrUpdate將分離的實體放入會話中。

當然,你可以配置NH的行爲不同。但是,如果遵循此默認行爲,則效果最佳。

1

無論是否顯式刷新修改Foo實體和從資源庫加載所有Foos之間的會話都無關緊要。如果您在會話中進行了可能會影響您嘗試運行的查詢結果的更改,NHibernate足夠智能地自動刷新自身。

理想情況下,我嘗試每個「工作單元」使用一個會話。這意味着一個可能涉及幾個較小步驟的連貫工作。如果您覺得您的體系結構中沒有可實現此目標的接縫,那麼管理存儲庫中的會話也將起作用。請注意,您錯過了NHibernate爲您提供的一些功能。

1

我投了斯特凡·莫澤的答案,如果我能 - 我仍然獲得與新罕布什爾交手自己,但我認爲這是很好的能夠寫出這樣的代碼:

private void SaveForm() 
{ 
    using (var unitofwork = UnitOfWork.Start()) 
    { 
     var foo = FooRepository.Get(_editingFooId); 
     var bar = BarRepository.Get(_barId); 

     foo.Name = txtName.Text; 
     bar.SomeOtherProperty = txtBlah.Text; 

     FooRepository.Save(foo); 
     BarRepository.Save(bar); 

     UnitOfWork.CommitChanges(); 
    } 
} 

所以這樣整個操作成功或失敗並回滾,保持倉庫之外的清空/事務管理。