2011-03-22 101 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配置來配置監聽器。