簡體   English   中英

將斷開連接的對象附加到NHibernate會話; 最佳實踐?

[英]Attaching a disconnected object to an NHibernate session; best practice?

我的存儲庫在UnitOfWork模型中工作; 所有操作,無論是檢索還是持久性,都必須在IDisposable UnitOfWork令牌對象的范圍內執行,后者在后台與執行所請求工作的Session相關聯。 所以,基本模式是:

using (var uow = repo.BeginUnitOfWork())
{
   try
   {
      //DB operations here; all repo methods require passing in uow.
      ...
      repo.CommitUnitOfWork(uow);
   }
   catch(Exception)
   {
      repo.RollbackUnitOfWork(uow);
      throw;
   }
}

我還實現了一些包裝器方法,允許您指定將在此框架中執行的lambda或委托,從而減少了每次都實現所有腳手架的需要。

我遇到的問題是使用這個模型,代碼必須“知道”用戶需要什么,並在UnitOfWork使用NHUtil.Initialize()急切加載它。 一旦UOW被置於使用塊的末尾,與任何PersistentBags相關聯的Session就會被關閉,因此無法對它們進行評估。 由於急切加載所有事情並不總是可行的,並且有點破壞了延遲加載ORM的目的,我正在實現一個Attach()方法。

這是問題; 在沒有內置的ISession.Attach()方法的情況下,我看到有三種方法建議將對象與新的Session相關聯。 完成工作的最佳做​​法是哪一項?

A:

if(!Session.Contains(domainObject))
    Session.Update(domainObject);

B:

Session.Merge(domainObject);

C:

Session.Lock(domainObject, LockMode.None);

D:以上都不是。 通過保持你的UOW太短而有效地禁用延遲加載並且無法實現延遲加載ORM的目的。 您必須將斷開連接的對象重新關聯為正常操作,這意味着您的工作單元邊界是錯誤的。

合並,更新和鎖定都有不同的用途。 如果您堅持使用當前的架構,那么Lock可能就是您想要的。

  • 更新 - 關聯已更改的對象
  • 鎖定 - 關聯未更改的對象
  • 合並 - 如果對象存在於當前會話中,則使用合並對象的更改進行更新,否則它與Lock相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM