我最近发现了如何在IPreDeleteEventListener名称空间中使用IPreInsertEventListenerIPreUpdateEventListenerNHibernate.Event审核实例的方法。

但是,仍然使我感到困惑的是,无论这些成功或失败的最终结果,这些事件将返回什么。

例如,让我们来看一下Ayende的博客文章:


NHibernate IPreUpdateEventListener & IPreInsertEventListener


按照他的示例,可以实现如下接口:

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


返回truefalse作为返回值的实际含义是什么,因为我有另一个示例,其中返回了true而不是Ayende所写的false


Soft Deletes With NHibernate


似乎返回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的是什么,具体取决于所处理的侦听器。

最佳答案

在这种情况下,返回值应该是枚举,让我们使用名称OnPreEventResult,这些可能是值:


OnPreEventResult.Continue =>继续当前返回false
OnPreEventResult.Break =>目前,当返回true时,操作将中止


因此,如以上两个示例所示,我们可以使用返回值来管理执行流程:


接着说:
如果我们在AuditEventListener中返回false,则实际上返回类似OnPreEventResult.Continue的内容。我们已经进行了一些自定义逻辑,我们希望NHibernate继续进行...因此返回false
中断/中止:
Ayende的示例向我们展示了如何将实际的DELETE更改为UPDATE。更新被明确地称为@event.Persister.Update(...,并且由于返回值true(即OnPreEventResult.Break),因此不执行删除


在代码中,返回的值存储在名为veto的局部变量中,该变量再次具有自我描述性。

看到:


EntityInsertAction,或
EntityDeleteAction


EntityInsertActionExecute()方法的摘录:

...
bool veto = PreInsert();

if (!veto)
{
    persister.Insert(id, state, instance, Session);
...

10-08 07:22
查看更多