Аудит NHibernate Единица работы с датой создания / обновления - PullRequest
2 голосов
/ 19 августа 2010

Я использую метод Айенде (http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx), чтобы установить дату создания и обновления для сущностей со Слушателями, но он устанавливает их только для затрагиваемой сущности, а не для чего-либо еще в единице работы.

Так, например, если я сделаю это:

Order order = repository.Get<Order>(1);
order.AddNote(new Note("this is a note"));
repository.SaveOrUpdate(order);

Примечание получает дату создания / обновления, но порядок - нет. Есть ли какие-нибудь хитрости, чтобы получить всю единицу работы дляпоказать обновление? Или мне физически нужно обновить свойство в заказе, чтобы установить дату обновления?

Если это имеет какое-то значение, я также использую S # arp Architecture.

Вот кодовый блок, который я использую:

public class AuditEventListener : IPreUpdateEventListener, IPreInsertEventListener
{
    public bool OnPreUpdate(PreUpdateEvent @event)
    {
        var audit = @event.Entity as AuditedEntity;
        if (audit == null)
            return false;

        var time = DateTime.Now;

        Set(@event.Persister, @event.State, "UpdateDate", time);

        audit.UpdateDate = time;
        return false;
    }

    public bool OnPreInsert(PreInsertEvent @event)
    {
        var audit = @event.Entity as AuditedEntity;
        if (audit == null)
            return false;


        var time = DateTime.Now;

        Set(@event.Persister, @event.State, "CreateDate", time);
        Set(@event.Persister, @event.State, "UpdatedDate", time);

        audit.CreateDate= time;
        audit.UpdateDate= time;

        return false;
    }

    private void Set(IEntityPersister persister, object[] state, string propertyName, object value)
    {
        var index = Array.IndexOf(persister.PropertyNames, propertyName);
        if (index == -1)
            return;
        state[index] = value;
    }
}

Ответы [ 2 ]

2 голосов
/ 20 августа 2010

Если я не ошибаюсь и коллекция Notes обратная, order не грязная, поэтому она не сохраняется и, следовательно, не запускает событие PreUpdate.

Так что да ... вам нужно будет «коснуться» заказа, если вы хотите принудительно обновить.

0 голосов
/ 21 августа 2010

Итак, Диего был прав, что заказ нужно было обновить, чтобы обновить. В итоге я добавил интерфейс IBelongToOrder ко всему, что было частью заказа:

public interface IBelongToOrder
{
    Order Order { get; set; }
}

Затем все коллекции в заказе реализовали этот интерфейс. Наконец, OnPreInsert / Update только что проверил для этого интерфейса и обновил соответственно, как:

var orderChild = @event.Entity as IBelongToOrder;
if (orderChild != null)
{
    orderChild.Order.UpdateDate = DateTime.Now;
}

Надеюсь, это поможет кому-то другому попытаться выяснить, как обновить коллекции в единице работы ...

...