2014-10-09 46 views
0

我使用NHibernate的用流利的配置和我有簡單的實體稱爲Administrator添加到映射集合中NHibernate的 - 交易關注

public class Administrator : Entity 
{ 
    public virtual ICollection<AdministratorClientAssociation> ClientsAssociation {get; protected set; } 
    ... 

    public virtual void AddClient(Client newClient) 
    { 
     var clientAssociation = new AdministratorClientAssociation() 
     { 
      AssociationDate = DateTime.Now, 
      Client = newClient, 
      ClientOwner = this 
     }; 
     ClientsAssociation.Add(clientAssociation); 
    } 
} 

收集ClientsAssociation1:n關係的外鍵(ClientOwner)並已設置Cascade.OnSaveUpdate映射。問題是NHibernate在這種情況下如何處理事務性外觀?通常情況下,我會創建交易,其中我將添加Client,然後AdministratorClientAssociation。問題是 - 我是否應該把它包裝到任何地方的事務中,我稱之爲AddClient(導致實體注入會話看起來很糟糕),還是在映射級聯集合時自動完成?

+0

這是什麼類型的應用程序?在Web應用程序中,通常在事務中包裝請求 – 2014-10-09 20:49:48

回答

1

如果NHibernate刷新關係,它將在同一個事務中。

雖然很多人聲稱在整個請求周圍使用事務是很常見的,但這也是錯誤的。

事務開始和結束之間的所有代碼都應該被視爲原子操作。要麼全部成功,要麼失敗。

如果我嘗試添加兩個客戶端,而第二個失敗,第一個應該存儲嗎?如果是這種情況,那麼添加一個客戶端就是原子操作,事務應該圍繞這段代碼。 如果在一個客戶端出現故障時不應存儲客戶端,則該事務應該在該批次附近。

你應該問自己的第二個問題是誰將負責管理交易。這個問題沒有一個答案。它完全取決於你的應用程序的工作方式。舉個例子,如果你使用CQRS,那麼事務應該由負責執行命令的組件來管理。

其他體系結構和要求將要求其他解決方案。