2010-09-14 40 views
1

我的應用有以下實體:NHibernate的審計 - PostInsert不工作

public class User 
{ 
    public virtual int UserID { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual IList<UserLog> Log { get; private set; } 

    public User() 
    { 
     Log = new List<UserLog>(); 
    } 
} 

public class UserLog 
{ 
    public virtual int UserLogID { get; set; } 
    public virtual User User { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual DateTime DateCreated { get; set; } 
} 

用下面的流利映射:

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("Users"); 
     Id(x => x.UserID); 
     Map(x => x.UserName); 
     HasMany(x => x.Log) 
      .KeyColumn("UserID") 
      .OrderBy("DateCreated") 
      .Inverse() 
      .Cascade.All(); 
    } 
} 

public class UserLogMap : ClassMap<UserLog> 
{ 
    public UserLogMap() 
    { 
     Table("UsersLog"); 
     Id(x => x.UserLogID); 
     References(x => x.User, "UserID"); 
     Map(x => x.UserName); 
     Map(x => x.DateCreated); 
    } 
} 

的UsersLog表只需登錄其對用戶所做的任何更改。我試圖使用NHibernate事件偵聽器自動掛鉤。我已經安裝我的配置,成功地調用以下2種方法:

public void OnPostInsert(PostInsertEvent @event) 
{ 
    if (@event.Entity is User) 
     InsertLog(@event.Entity); 
} 

public void OnPostUpdate(PostUpdateEvent @event) 
{ 
    if (@event.Entity is User) 
     InsertLog(@event.Entity); 
} 

編輯(這裏是InsertLog法):

private void InsertLog(object entity) 
{ 
    var context = ServiceLocator.Current.GetInstance<IDataContext>(); 
    var user = (User)entity; 
    context.Repository<UserLog>().Insert(new UserLog 
    { 
     User = user, 
     UserName = user.UserName, 
     DateCreated = DateTime.UtcNow 
    }); // Insert calls ISession.SaveOrUpdate(entity) 
} 

當我更新的日誌被成功地插入一條記錄,但是當我插入記錄我得到一個錯誤,告訴我UserLog不能在UsersLog表中爲空。我玩過幾個不同的變體,但似乎沒有任何工作。

我真的很感激,如果有人能告訴我如何做到這一點。謝謝

+0

你可以發佈InsertLog()方法的代碼嗎? – DanP 2010-09-14 11:32:07

+0

嗨,我用InsertLog方法更新了我的帖子。它基本上抓住了我的數據上下文(這是NHibernate Session的包裝)並插入到存儲庫中。注意:我必須使用ServiceLocator而不是構造函數注入,因爲在設置數據上下文和nhibernate事件偵聽器時,我有循環引用問題。 – nfplee 2010-09-14 12:39:17

+0

你是PK自動增量嗎?如果它是NH將如何爲它提供價值? – epitka 2010-09-14 12:43:20

回答

5

解決方法張貼在問題的評論。我只需要使用:

@event.Session.GetSession(NHibernate.EntityMode.Poco).Save(...); 

保存用戶而不是訪問存儲庫。

+1

注意到我的更改沒有持續。顯式調用Flush()幫助在發佈DanP後提到。 http://groups.google.com/group/nhusers/msg/1b09a4f1583da646 – 2011-04-22 16:59:36

+0

GetSession方法的目的是什麼?這解決了我的問題,但不知道爲什麼。 – 2016-06-25 02:37:10

+0

我不確定要告訴你實情。我剛接受它的工作。 – nfplee 2016-06-27 07:58:07