如何使用NHibernate实现ChangeTime和ChangeUser列?

如何使用NHibernate实现ChangeTime和ChangeUser列?,nhibernate,Nhibernate,我正在尝试将NHibernate与现有数据库一起使用。在数据模型中,每个表中都有列,其中包含上次更新行的时间和用户名。我如何使用NHibernate实现这一点 我尝试实现一个拦截器,在使用IInterceptor.OnSave方法保存之前,在实体中设置ChangeTime和ChangeUser。这不起作用,因为即使没有修改其他属性,设置这些属性也会触发对行的更新 如果有任何方法告诉NHibernate排除ChangeTime和ChangeUser属性,那么它就可以进行脏检查。但我还没有找到任何方

我正在尝试将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() 
};