工作單元模式下,操作需顯式提交或回滾。本文構建 DAL 層 CRUD 方法,對比 LINQ to SQL 的 SubmitChanges,闡述 NHibernate 的 Flush 機制與三大對象狀態。
NHibernate 中 ISession 為工作單元,修改需 Flush() 同步到資料庫,事務提交時自動觸發。
public int CreateCustomer(Customer customer)
{
int newId = (int)_session.Save(customer);
_session.Flush();
return newId;
}
測試:新建 Customer → Save 返回 ID → 再次查詢驗證存在。
public void DeleteCustomer(Customer customer)
{
_session.Delete(customer);
_session.Flush();
}
語義理解:Delete() 將持久化實例轉為臨時實例,應用程序仍持有引用但資料庫記錄已移除。支援 HQL 批量刪除,順序不影響外鍵約束。
public void UpdateCustomer(Customer customer)
{
_session.Update(customer);
_session.Flush();
}
測試:查詢 ID=1 → 修改 Firstname → Update → 再次查詢驗證修改生效。
public void SaveOrUpdateCustomer(IList<Customer> customers)
{
foreach (var c in customers)
_session.SaveOrUpdate(c);
_session.Flush();
}
智能判斷邏輯:
Save() 持久化新對象Update() 同步修改測試場景:混合列表包含「查詢修改的現有對象」與「新建對象」,單次調用完成增更新合一。
| 狀態 | 英文 | 特徵 | 典型場景 |
|---|---|---|---|
| 瞬時態 | Transient | 無標識符、未關聯 Session、資料庫無記錄 | new Customer() |
| 持久態 | Persistent | 有標識符、關聯 Session、資料庫有記錄、變更自動同步 | session.Load/Get/Save 後 |
| 游離態 | Detached | 有標識符、未關聯 Session(Session 關閉/清理/驅逐) | 跨請求傳遞、Web 應用 |
Transient --Save()--> Persistent --Flush/Commit--> Database
^ |
| | Delete()
| v
+---- Evict/Close ---- Detached --Update/SaveOrUpdate()--> Persistent
掌握 Save/Update/Delete/SaveOrUpdate 與 Flush 配合,理解三大狀態轉換,是驾驭 NHibernate 的前提。下篇將介紹事務管理將操作納入 ACID 保護。