【问题标题】:NHibernate save / update event listeners: listening for child object savesNHibernate 保存/更新事件监听器:监听子对象保存
【发布时间】:2010-12-30 17:54:35
【问题描述】:

我有一个 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 根本没有被解雇。奇怪的是,如果我连接到 SaveEventListeners SaveOrUpdateEventListeners:

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

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

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

【问题讨论】:

  • 你解决了吗?有同样的问题
  • 我也是!有人找到解决方案了吗?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,但我认为这需要在对象模型中建立单向关系(SubArea 也会引用 Area),但在这种情况下,我不希望或不需要它。
    • 这肯定是解决问题的最简单方法。 @JamesAllen - 你为什么不想要从 SubArea 到 Area 的多对一?
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2011-07-05
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多