Мягкое удаление - ActiveRecord со слушателями - PullRequest
2 голосов
/ 17 января 2011

Я использую ActiveRecord с nHibernate и пытаюсь реализовать мягкое удаление, чтобы объекты помечались как «IsDeleted», а не фактически удаляли их.Мне, очевидно, нужна опция каскада для работы.

[assembly: AddEventListener(typeof(MyNamespace.SoftDeleteListener))] namespace MyNamespace { public class SoftDeleteListener : DefaultDeleteEventListener
{
    protected override void DeleteEntity(IEventSource session, object entity, EntityEntry entityEntry, bool isCascadeDeleteEnabled,
        IEntityPersister persister, ISet transientEntities)
    {
        if (entity is IPermanentRecord)
        {
            ((IPermanentRecord)entity).IsDeleted = true;
            this.CascadeBeforeDelete(session, persister, entity,
                entityEntry, transientEntities);
            this.CascadeAfterDelete(session, persister, entity, transientEntities);
        }
        else
        {
            base.DeleteEntity(session, entity, entityEntry,
                isCascadeDeleteEnabled, persister, transientEntities);
        }
    }
}

}

Моя сущность - "Продукт" Реализует

interface IPermanentRecord
{
    bool IsDeleted { get; set; }
}

Проблема в том, что слушательбыть уволенным при удалении объекта, он просто удаляет его!

1 Ответ

1 голос
/ 18 января 2011

Всем, кто интересуется ...

Я нашел конфигурацию nHibernate и добавил слушателя вручную, и он запустился ..

foreach (NHibernate.Cfg.Configuration cfg in ActiveRecordMediator.GetSessionFactoryHolder().GetAllConfigurations())
        {
            cfg.SetListener(ListenerType.Delete, new SoftDeleteListener());
            cfg.AddAssembly(assem);
        }
...