Перехватчик NHibernate не вызывается для изменений в множестве / списке «многие ко многим» - PullRequest
4 голосов
/ 09 июня 2010

У меня есть приложение, использующее NHibrenate, и я использую решение на основе перехватчиков для ведения журнала / аудита.

В основном у меня есть класс, наследующий от EmptyInterceptor и переопределяющий OnFlushDirty, OnSave и OnDelete.

Все работает отлично - за исключением - когда я добавляю или удаляю из набора или списка, который сопоставлен, используя многие-ко-многим, без изменения каких-либо других свойств, ни один из методов-перехватчиков не вызывается.в NHibrenate и обнаружить эти изменения?

Класс выглядит следующим образом:

public class SomeClass
{
  ... properties ..
  private Iesi.Collections.ISet _setOfOthers = new Iesi.Collections.HashedSet();
  public virtual Iesi.Collections.ISet SetOfOthers
  {
    get { return _setOfOthers; }
    set { _setOfOthers = value; }       
  }
  ... some more properties ...

}

С этим отображением hbm:

<class name="MyAssembly.SomeClass, MyAssembly" table="[SomeClass]">
   ... properties ..
   <set name="SetOfOthers" table="SomeClass_SetOfOthers" cascade="none">
      <key column="Owner" />
      <many-to-many column="Item" class="MyAssembly.OtherClass, MyAssembly" />
   </set>
   .. some more properties ...
</class>

I 'Используя NHibrenate 2.0.1 (если это что-то меняет), сейчас не самое подходящее время в жизненном цикле проекта для обновления NHibrenate - но я буду обновляться, если мне абсолютно необходимо.

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 октября 2011

Вы должны переопределить onCollectionUpdate Перехватчика.

Чем использовать коллекцию как IPersistentCollection для доступа к своему CollectionSnapshot и Владельцу.

И удачи!

0 голосов
/ 25 марта 2011

Как реализована ваша конфигурация и настройка сеанса?

Связали ли вы Interceptor с такой конфигурацией?

config.SetInterceptor(new YouInterceptor());

А затем открыть сеанс, передав его в качестве параметра, подобного этому?

if (config.Interceptor != null)
{
    session = factory.OpenSession(config.Interceptor);
}
else
{
    session = factory.OpenSession();
}
...