NHibernate EventListener将属性设置为空

时间:2019-06-05 12:50:38

标签: c# nhibernate

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

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。但是我不知道访问实体很热。

有什么想法吗?预先感谢。

1 个答案:

答案 0 :(得分:2)

在NHibernate上使用侦听器之前,您必须了解一些重要的知识。它将在从NHibernate角度映射的所有实体上运行。如果在上面编写了错误的代码,则可能会降低应用程序的性能。鉴于此,您可以在NHibernate Configuration对象上定义一个侦听器。您定义一个类,该类通过所需的NHibernate侦听器实现接口,并实现该方法。将此类的实例添加到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上了解有关事件侦听器和拦截器的更多信息。