Недавно я узнал, как проводить аудит экземпляров с IPreDeleteEventListener
, IPreInsertEventListener
и IPreUpdateEventListener
в пространстве имен NHibernate.Event
.
Тем не менее, меня все еще смущает, что вернут эти события в случае успешного или неудачного финала.
Например, давайте взглянем на статью в блоге Айенде, найденную здесь:
Следуя его примеру, можно было бы реализовать интерфейсы следующим образом:
public class AuditEventListener : IPreInsertEventListener {
public bool OnPreInsert(OnPreInsert @event) {
var audit = @event.Entity as IHaveAuditInformation;
if (audit == null) return false;
var time = DateTime.Now;
var name = WindowsIdentity.GetCurrent().Name;
Set(@event.Persister, @event.State, "CreatedAt", time);
Set(@event.Persister, @event.State, "CreatedBy", name);
audit.CreatedAt = time;
audit.CreatedBy = name;
return false;
}
}
Что на самом деле означает возвращать true
или false
в качестве возвращаемого значения, поскольку у меня есть другой пример, где true
возвращается вместо false
, как писал Айенде.
Который, кажется, возвращает true
вместо false
.
public class SoftDeletableListener : IPreDeleteEventListener {
public void Register(Configuration cfg) {
cfg.EventListeners.PreDeleteEventListeners =
new IPreDeleteEventListener[] { this }
.Concat(cfg.EventListeners.PreDeleteEventListeners)
.ToArray();
}
public Boolean OnPreDelete(PreDeleteEvent @event) {
ISoftDeletable softDeletable = @event.Entity as ISoftDeletable;
if (softDeletable == null) return true;
EntityEntry entry = @event.Session
.GetSessionImplementation()
.PersistenceContext
.GetEntry(@event.Entity);
entry.Status = Status.Loaded;
softDeletable.Deleted = true;
Object id = @event.Persister
.GetIdentifier(@event.Entity, @event.Session.EntityMode);
Object [] fields = @event.Persister
.GetPropertyValues(@event.Entity, @event.Session.EntityMode);
Object version = @event.Persister
.GetVersion(@event.Entity, @event.Session.EntityMode);
@event.Persister.Update(id
, fields
, new Int32[1]
, false
, fields
, version
, @event.Entity
, null
, @event.Session.GetSessionImplementation());
return true;
}
}
Поэтому мне интересно, что false
/true
на самом деле сообщает NHibernate в зависимости от слушателя, с которым имеет дело.
SoftDeletableListener
не должно бытьif (softDeletable == null) return false;
(false
вместоtrue
)? В противном случае никакая сущность не будет удалена, будь тоISoftDeletable
или нет. - person lalibi   schedule 06.07.2016