7

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

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(area) )时,该区域被保存并且子 SubAreas 自动级联。

我想添加一个保存或更新事件侦听器,以便在我的区域和/或子区域持续存在时捕获。比如说我有一个区域,它有 5 个子区域。如果我连接到 SaveEventListeners:

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

当我保存该区域时,Mylistener 只为区域触发一次(子区域被忽略)。我希望在事件侦听器中也能捕获 5 个子区域。如果我改为使用 SaveOrUpdateEventListeners:

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

当我保存该区域时,Mylistener 根本没有被触发。奇怪的是,如果我连接到 SaveEventListenersSaveOrUpdateEventListeners:

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

当我保存该区域时,Mylistener 会被触发11 次:该区域一次,每个子区域两次!(我认为是因为 NHIbernate 正在插入子区域,然后使用区域外键进行更新)。

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

4

2 回答 2

0

NH 发出 INSERT 语句,以便在无法知道对象的 Id 时知道它(例如 IDENTITY 或 SEQUENCE)。

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

于 2010-05-14T11:34:47.953 回答
0

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

于 2009-12-29T11:20:54.483 回答