如何使用NHibernate实现ChangeTime和ChangeUser列?
我正在尝试将NHibernate与现有数据库一起使用。在数据模型中,每个表中都有列,其中包含上次更新行的时间和用户名。我如何使用NHibernate实现这一点 我尝试实现一个拦截器,在使用IInterceptor.OnSave方法保存之前,在实体中设置ChangeTime和ChangeUser。这不起作用,因为即使没有修改其他属性,设置这些属性也会触发对行的更新 如果有任何方法告诉NHibernate排除ChangeTime和ChangeUser属性,那么它就可以进行脏检查。但我还没有找到任何方法来实现这一点如何使用NHibernate实现ChangeTime和ChangeUser列?,nhibernate,Nhibernate,我正在尝试将NHibernate与现有数据库一起使用。在数据模型中,每个表中都有列,其中包含上次更新行的时间和用户名。我如何使用NHibernate实现这一点 我尝试实现一个拦截器,在使用IInterceptor.OnSave方法保存之前,在实体中设置ChangeTime和ChangeUser。这不起作用,因为即使没有修改其他属性,设置这些属性也会触发对行的更新 如果有任何方法告诉NHibernate排除ChangeTime和ChangeUser属性,那么它就可以进行脏检查。但我还没有找到任何方
感谢您的帮助。您应该注册预插入和预更新事件的侦听器。您可以通过如下配置来完成:
<hibernate-configuration>
...
<event type="pre-update">
<listener class="MyListener, MyAssembly"/>
</event>
<event type="pre-insert">
<listener class="MyListener, MyAssembly"/>
</event>
</hibernate-configuration>
并对预更新事件执行相同的操作
编辑:这一个负责插入和更新,似乎很有效。Mookid的回答是正确的,尽管我想指出,如果使用s#arp架构,NHib配置应设置如下:
<hibernate-configuration>
<session-factory>
...
<event type="pre-update">
<listener class="MyListener, MyAssembly"/>
</event>
<event type="pre-insert">
<listener class="MyListener, MyAssembly"/>
</event>
</session-factory>
</hibernate-configuration>
...
事件元素进入会话工厂元素。嘿,我刚刚在一个项目中解决了这个问题,下面是我的答案
public interface IDateModified
{
DateTime Created { get; set; }
DateTime Modified { get; set; }
}
public class CustomDefaultSaveOrUpdateEventListener
: DefaultSaveOrUpdateEventListener
{
protected override object EntityIsPersistent(SaveOrUpdateEvent evt)
{
var entity = evt.Entity as IDateModified;
if (entity != null)
{
entity.Modified = DateTime.Now;
}
return base.EntityIsPersistent(evt);
}
protected override object EntityIsTransient(SaveOrUpdateEvent evt)
{
var entity = evt.Entity as IDateModified;
if (entity != null)
{
entity.Created = entity.Modified = DateTime.Now;
}
return base.EntityIsTransient(evt);
}
}
然后在我的配置中(我使用Fluent NHibernate在代码中配置我的单元测试)
太棒了 除了使用侦听器,还可以使用拦截器:
谢谢!回答得很好,对我帮助很大。此方法不修改实体的属性,只修改写入数据库的内容。但同时设置实体的属性似乎没有问题。要更完整地解决这个问题,请查看Ayende的博客文章,它需要更新实体对象(evt.entity)和状态。
public interface IDateModified
{
DateTime Created { get; set; }
DateTime Modified { get; set; }
}
public class CustomDefaultSaveOrUpdateEventListener
: DefaultSaveOrUpdateEventListener
{
protected override object EntityIsPersistent(SaveOrUpdateEvent evt)
{
var entity = evt.Entity as IDateModified;
if (entity != null)
{
entity.Modified = DateTime.Now;
}
return base.EntityIsPersistent(evt);
}
protected override object EntityIsTransient(SaveOrUpdateEvent evt)
{
var entity = evt.Entity as IDateModified;
if (entity != null)
{
entity.Created = entity.Modified = DateTime.Now;
}
return base.EntityIsTransient(evt);
}
}
configuration.EventListeners.SaveOrUpdateEventListeners
= new ISaveOrUpdateEventListener[]
{
new CustomDefaultSaveOrUpdateEventListener()
};