NHibernate EventListeners - получение значения свойства сохраняемой сущности - PullRequest
3 голосов
/ 17 ноября 2009

Я реализую собственный EventListener для сохранения информации аудита в NHibernate.

В настоящее время я расширяю DefaultSaveOrUpdateEventListener, переопределяя PerformSaveOrUpdate, просматривая свойства каждого объекта и сохраняя их в другом месте.

Это работает с простыми свойствами, но не работает при каскадном сохранении отношения один-ко-многим.

Если я возьму следующие лица:

[ActiveRecord]
public class Child
{
    [PrimaryKey(PrimaryKeyType.GuidComb)]
    public Guid Id { get; set; }

    [BelongsTo]
    public Parent Parent { get; set; }
}

[ActiveRecord]
public class Parent
{
    [PrimaryKey(PrimaryKeyType.GuidComb)]
    public Guid Id { get; set; }

    [HasMany(Cascade = ManyRelationCascadeEnum.SaveUpdate)]
    public IList<Child> Children { get; set; }
}

А потом сохранить родителя с ребенком:

ActiveRecordMediator<Parent>.Save(new Parent
{
    Children = new List<Child>
    {
        new Child()
    }
});

Ребенок получит правильный родительский объект, назначенный ему, когда он сохранен в базе данных, но свойство 'Parent' дочернего элемента равно нулю, когда вызывается мой EventListener.

Как я могу получить значение, которое в действительности будет сохранено в базе данных в этом случае?

[РЕДАКТИРОВАТЬ] Недавно я пытался заставить это работать, подключив каскад и увидев, что еще было сохранено в то время, но это кажется ужасно ненадежным, и я бы предпочел получить данные из NHibernate. так что я знаю, что это согласуется с базой данных.

Ответы [ 3 ]

2 голосов
/ 27 ноября 2009

Я не уверен, как вы можете сделать это с ActiveRecord, но это связано с механизмом, в котором NHibernate сохраняет отношения родитель / потомок.

Сохранение дочернего каскада перед сохранением родителя в NHibernate осуществляется в зависимости от того, какой конец отношения помечен как «обратный = true», а дочерний элемент должен иметь атрибут «not-null = true» для элемента (который определяет, какому концу принадлежит отношение). Это сделает так, чтобы Ребенок управлял состоянием отношений.

Тогда вы можете просто сохранить ребенка, и родитель будет обновлен соответствующей информацией. Это сгенерирует одну инструкцию INSERT вместо INSERT AND UPDATE, которую вы, вероятно, видите сейчас. Не уверен, решит ли это вашу проблему, но я считаю, что проблема, с которой вы столкнулись, связана с этим поведением. Вы можете прочитать больше по этой ссылке:

https://www.hibernate.org/hib_docs/nhibernate/html/example-parentchild.html

0 голосов
/ 24 ноября 2009

Я не использую ActiveRecord, вместо этого я использую NHibernate, поэтому я собираюсь предположить, что они обрабатывают отношения родитель-потомок одинаково (https://www.hibernate.org/hib_docs/nhibernate/html/example-parentchild.html)

Что произойдет, если вы оставите ORM для управления ссылкой на родительский элемент (установив Inverse = true в атрибуте HasMany)?

[ActiveRecord]
public class Parent
{
    [PrimaryKey(PrimaryKeyType.GuidComb)]
    public Guid Id { get; set; }

    [HasMany(Cascade = ManyRelationCascadeEnum.SaveUpdate, Inverse=true)]
    public IList<Child> Children { get; set; }
}
0 голосов
/ 22 ноября 2009

Я вижу, что вы используете Замок ActiveRecord. Я тоже экспериментировал с этим.

В этом есть некоторая странность, потому что в предоставленном вами коде свойство Parent объекта Child будет установлено только после того, как ваши материалы сохранены в базе данных. До тех пор его значение будет нулевым. (Я не знаю, относится ли это поведение к ActiveRecord или также к NHibernate.)

Возможно, если вы назначите родительские свойства дочерних объектов вручную, это сработает.

var parent = new Parent();
var child = new Child()
{
    Parent = parent
};
parent.Children.Add(child);

ActiveRecordMediator<Parent>.Save(child);
ActiveRecordMediator<Parent>.Save(parent);

Возможно, порядок, в котором вы сохраняете сущности, также должен что-то делать с этим вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...