2009-12-29 5 views
7

У меня есть объект Area, который имеет много ПОДРАЙОНЕ детей:NHibernate сохранить/обновить слушатель событий: прослушивание для дочернего объекта сохраняет

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 только выстрелил раз только для области (подзоны игнорируются). Я хочу, чтобы 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 раз: один раз для области, и в два раза для каждого подрайона! (Я думаю, потому что NHIbernate ВСТАВЛЯЕТ СУББОТУ, а затем UPDATING с внешним ключом области).

Кто-нибудь знает, что я делаю неправильно здесь, и как я могу заставить слушателя стрелять один раз для каждой области и подрайона?

+0

Вы справились с этим? с тем же вопросом – andy

+0

Я тоже! Кто-нибудь нашел решение? – nozzleman

ответ

0

Не 100% относится к вашему вопросу, но если вы сопоставляете с inverse = "true" в своей коллекции, вы, по крайней мере, не получаете вставку AND инструкции по обновлению.

+0

Правда, но я думаю, что для этого потребовалось бы сделать однонаправленное отношение в объектной модели (SubArea будет иметь ссылку на Area aswell), но в этом случае я не хочу или не нуждаюсь в этом. –

+0

Конечно, это был бы самый простой способ решить проблему. @JamesAllen - Почему вы не хотите, чтобы много-к-одному из SubArea в Area? –

0

NH вызывает инструкцию INSERT, чтобы знать идентификатор объекта, если он не может быть известен (например, IDENTITY или SEQUENCE).

Так что, если вы хотите аннулировать, что вам нужно использовать генератор id, который не требует округления к DB (например, guid или guid.combo).