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

Jam*_*len 7 nhibernate events children event-listener event-handling

我有一个Area对象,它有许多SubArea子元素:

public class Area
{
    ...
    public virtual IList<SubArea> SubAreas { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

他将孩子映射为单向非反向关系:

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

区域是我的聚合根.当我保存一个区域(例如Session.Save(区域))时,该区域被保存并且子SubAreas自动级联.

我想添加一个保存或更新事件监听器,以便在持久保存区域和/或子区域时捕获.比方说,我有一个区域,有5个SubAreas.如果我挂钩到SaveEventListeners:

Configuration.EventListeners.SaveEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener };
Run Code Online (Sandbox Code Playgroud)

当我保存区域时,Mylistener 仅针对区域被触发一次(SubAreas被忽略).我希望在事件监听器中捕获5个SubAreas.如果我挂钩到SaveOrUpdateEventListeners:

Configuration.EventListeners.SaveOrUpdateEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener };
Run Code Online (Sandbox Code Playgroud)

当我保存区域时,Mylistener根本没有被解雇.奇怪的是,如果我挂钩到SaveEventListeners SaveOrUpdateEventListeners:

Configuration.EventListeners.SaveEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener };
Configuration.EventListeners.SaveOrUpdateEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener };
Run Code Online (Sandbox Code Playgroud)

当我保存区域时,Mylistener被解雇11次:一次为该区域,每次SubArea两次!(我认为因为NHIbernate正在插入SubArea然后使用区域外键更新).

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

Ken*_*son 0

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