2009-12-29 56 views
7

我有一個區域,對象,它有許多分區孩子:NHibernate的保存/更新事件監聽器:監聽子對象節省

public class Area 
{ 
    ... 
    public virtual IList<SubArea> SubAreas { get; set; } 
} 

他的孩子被映射爲單向非反比關係:

public class AreaMapping : ClassMap<Area> 
{ 
    public AreaMapping() 
    { 
     HasMany(x => x. SubAreas).Not.Inverse().Cascade.AllDeleteOrphan(); 
    } 
} 

該區域是我的聚合根。當我保存一個區域(例如Session.Save(區域))時,區域被保存並且子SubAreas自動級聯。

我想添加一個保存或更新事件偵聽器,以便在我的區域和/或子區域被持久時捕獲。比如說我有一個區域,裏面有5個SubAreas。如果我勾入SaveEventListeners:

Configuration.EventListeners.SaveEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener }; 

當我保存的區域,myListener的是隻能針對地區發射一次(分區被忽略)。我希望5個SubAreas能夠在事件監聽器中被捕獲。如果我勾入SaveOrUpdateEventListeners代替:

Configuration.EventListeners.SaveOrUpdateEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener }; 

當我保存的區域,myListener的是解僱的。該地區一次,兩次,每次分區:奇怪的是,如果我掛到SaveEventListeners SaveOrUpdateEventListeners:

Configuration.EventListeners.SaveEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener }; 
Configuration.EventListeners.SaveOrUpdateEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener }; 

當我保存的區域,myListener的觸發11倍! (我認爲是因爲NHIbernate是INSERT的SubArea,然後用區域外鍵進行UPDATING)。

有沒有人知道我在做什麼錯在這裏,以及如何讓聽衆爲每個區域和分區啓動一次

+0

你工作了嗎?有同樣的問題 – andy 2011-01-20 00:04:48

+0

我也是!有沒有人找到解決方案? – nozzleman 2016-02-26 09:41:24

回答

0

與你的問題不是100%相關,但如果你在你的集合上映射inverse =「true」,你至少不會得到插入更新語句。

+0

確實如此,但我認爲這需要在對象模型中使關係爲單向(SubArea對區域也有參考),但在這種情況下,我不需要或不需要這種關係。 – 2009-12-29 13:16:32

+0

這當然是解決問題的最簡單方法。 @JamesAllen - 你爲什麼不想從SubArea到Area的多對一? – 2011-05-07 02:49:55

0

NH發出INSERT語句以便知道對象的Id(如果它不能被知道)(例如IDENTITY或SEQUENCE)。

所以,如果你想要使用一個不需要往返於數據庫的id的生成器(例如guid或guid.combo),就無效。