NHibernate保存/更新事件监听器:监听子对象保存

时间:2009-12-29 10:37:07

标签: nhibernate events event-handling children event-listener

我有一个具有许多SubArea子元素的Area对象:

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仅针对区域一次被触发(忽略SubAreas)。我希望在事件监听器中捕获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次:一次为该区域,一次为每个SubArea两次! (我认为因为NHIbernate正在插入SubArea然后使用区域外键更新)。

有谁知道我在这里做错了什么,以及如何让听众为每个区域和分区点燃一次

2 个答案:

答案 0 :(得分:0)

与您的问题不是100%相关,但如果您在集合中使用inverse =“true”进行映射,则至少不会获得插入 AND 更新语句。

答案 1 :(得分:0)

NH发出INSERT语句,以便知道对象的Id,如果它不可知(例如IDENTITY或SEQUENCE)。

因此,如果您想要取消,则需要使用不需要往返DB的id生成器(例如guid或guid.combo)。