2011-03-22 138 views
1

在我的数据库中的每个对象上,我都拥有CreatedBy,CreatedOn,ModifiedOn和ModifiedBy的审计字段。将CreatedBy和ModifiedBy映射到我创建的映射到我的用户表的User对象。我最初将UserId(主键)存储在这些字段中,并且所有东西都映射得很好,其映射定义为 <many-to-one name="CreatedBy" column="CreatedBy" lazy="proxy"></many-to-one>NHIbernate:映射审计用户

但是,我想切换这些字段来存储用户名,而我找不到如何从非主键字段加载持久性用户实体。我研究过IUserTypes,ICompositeUserType,事件监听器和其他一些随机事物,但我似乎无法完成任何工作。

截至目前为止,我已经添加了一个CreatedByName和ModifiedByName字段,用于存储用户名,而原始字段仍然存储ID(在使用CompositeUserType时执行此操作),因此我有ID和用户名如果需要的话。

这似乎是应该足够普遍的东西,应该有一个解决方案,但我找不到任何东西。

回答

0

由于审计是不是企业的关注,我已经找到了解决,这是使用NHibernate的事件侦听器的最佳方式。

样本听众可能是这样的:

namespace ADT.Data.Repositories.NHibernate.EventListeners 
{ 


    public class PreInsertEventListener : IPreInsertEventListener 
    { 


     public bool OnPreInsert(PreInsertEvent @event) 
     { 
      var audit = @event.Entity as IHaveAuditInformation; 
      if (audit == null) 
       return false; 

      var time = DateTime.Now; 
      var user = Security.GetLoggedInUser(); 

      Set(@event.Persister, @event.State, "LogDate", time); 
      Set(@event.Persister, @event.State, "User", user); 

      audit.LogDate = time; 
      audit.User = user; 

      return false; 
     } 



     private void Set(IEntityPersister persister, object[] state, string propertyName, object value) 
     { 
      var index = Array.IndexOf(persister.PropertyNames, propertyName); 
      if (index == -1) 
       return; 
      state[index] = value; 
     } 
    } 
} 

我登录用户和实体插入日期。还有一个preupdate监听器。当然,你必须用NHibernate配置来配置监听器。