我有一个具有许多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然后使用区域外键更新)。
有谁知道我在这里做错了什么,以及如何让听众为每个区域和分区点燃一次?
答案 0 :(得分:0)
与您的问题不是100%相关,但如果您在集合中使用inverse =“true”进行映射,则至少不会获得插入 AND 更新语句。
答案 1 :(得分:0)
NH发出INSERT语句,以便知道对象的Id,如果它不可知(例如IDENTITY或SEQUENCE)。
因此,如果您想要取消,则需要使用不需要往返DB的id生成器(例如guid或guid.combo)。