NHibernate EventListener 设置 属性 null

NHibernate EventListener to set property null

我有一个看起来与此类似的模型:

public class Employee {
    public virtual string Name { get; set; }
    public virtual string Name { get; set; }
    public virtual Gender Gender { get; set; }
}

我有这样的查询:

var myEmployees = session.Query<Employee>()
                         .Where(a => a.Name.Equals(name)); // name is given as parameter

现在我需要使用 NHibernate EventListener 将 Gender 设置为 null。我想我必须使用 IPreLoad 或 IPostLoad EventListener。但我不知道访问实体的热点。

有什么想法吗?提前致谢。

在使用 NHibernate 上的监听器之前,您必须了解一些重要的事情。它将 运行 覆盖从 NHibernate 视角映射的所有实体。如果您在上面编写了错误的代码,它会降低应用程序的性能。鉴于此,您可以在 NHibernate Configuration 对象上定义一个侦听器。您定义一个 class 来实现您想要的 NHibernate 侦听器的接口并实现该方法。将此 class 的一个实例添加到 NHibernate 配置中。 (我没有测试下面的代码,它只是一个草稿)示例:

using NHibernate;
using NHibernate.Event;
using NHibernate.Persister.Entity;

public class EmployeePostLoadListener : IPostLoadEventListener
{
    public virtual void OnPostLoad(PostLoadEvent postloadEvent)
    {
        if (postloadEvent.Entity is Employee)
        {
            var employee = (Employee)postloadEvent.Entity;

            // do what you want with the object
            employee.Gender = null;
        }
    }
}

在NHibernate的配置中,你可以添加这个监听器,像这样:

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
cfg.EventListeners.PostLoadEventListeners = new IPostLoadEventListener[] {new EmployeePostLoadListener()};

documentation 上查看有关 EventListeners 和 Interceptors 的更多信息。