当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用NHibernate实现ChangeTime和ChangeUser列?》经验,为你挑选了2个好方法。

我正在尝试将NHibernate与现有数据库一起使用.在数据模型中,每个表中都有列,其中包含对行进行的上次更新的时间和用户名.我如何使用NHibernate做到这一点?

我尝试实现一个拦截器,它在使用IInterceptor.OnSave方法保存之前在实体中设置ChangeTime和ChangeUser.这不起作用,因为即使没有修改其他属性,设置这些属性也会触发对行的更新.

如果有任何方法告诉NHibernate排除ChangeTime和ChangeUser属性然后它进行脏检查,它可能有效.但我还没有找到任何方法来实现这一目标.

谢谢你的帮助.



1> mookid8000..:

您应该为预插入和预更新事件注册一个侦听器.您可以通过以下配置完成此操作:


    ...
    
        
    
    
        
    

然后实现一个监听器 - 这样的事情(可能不完全准确 - 写下我的记忆):

public class MyListener : IPreUpdateEventListener, IPreInsertEventListener
{
    public bool OnPreUpdate(PreUpdateEvent evt)
    {
        if (evt.Entity is IHasLastModified)
            UpdateLastModified(evt.State, evt.Persister.PropertyNames);

        return false;
    }

    public bool OnPreInsert(PreInsertEvent evt)
    {
        if (evt.Entity is IHasLastModified)
            UpdateLastModified(evt.State, evt.Persister.PropertyNames);

        return false;
    }

    void UpdateLastModified(object[] state, string[] names)
    {
        var index = Array.FindIndex(names, n => n == "LastModified");

        state[index] = DateTime.Now;
    }
}

并使用预更新事件执行相同的操作.

编辑:这个照顾插入和更新,它似乎工作.


根据Ayende的博客文章,有必要更新实体对象(evt.Entity)和状态.
有关此问题的更完整解决方案,请查看http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx

2> superlogical..:

嘿,我只是要在我正在进行的项目中解决这个问题,这是我的答案

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在代码中配置我的单元测试)

configuration.EventListeners.SaveOrUpdateEventListeners 
= new ISaveOrUpdateEventListener[]
{
    new CustomDefaultSaveOrUpdateEventListener() 
};

AWESOMENESSSSSSSS!

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有