![](/img/trans.png)
[英]Attaching a disconnected nHibernate entity to a session and reading from the database
[英]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可能就是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.