我有一个看起来与此相似的模型:
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。但是我不知道访问实体很热。
有什么想法吗?预先感谢。
答案 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上了解有关事件侦听器和拦截器的更多信息。