2011-01-17 6 views
2

Ich benutze ActiveRecord mit nHibernate und versuche, ein weiches Löschen zu implementieren, so dass Objekte als "IsDeleted" markiert werden, anstatt sie tatsächlich zu löschen. Ich brauche offensichtlich die Kaskadenoption, um zu arbeiten.Soft delete - ActiveRecord mit Listener

[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); 
     } 
    } 
} 

}

Meine Einheit - "Produkt" Implementiert

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

Das Problem ist, wird der Hörer nicht gefeuert werden, wenn das Objekt zu löschen sie es einfach löschen!

Antwort

1

für jeden, der interessiert ist ...

fand ich die nHibernate Konfiguration und den Hörer manuell hinzugefügt und es gebrannt ..

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

Hallo Paul. Ich habe Listener registriert und es feuert ... aber notiere, dass es nicht aktualisiert wird ... kannst du mir helfen? –