我的應用有以下實體: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表中爲空。我玩過幾個不同的變體,但似乎沒有任何工作。
我真的很感激,如果有人能告訴我如何做到這一點。謝謝
你可以發佈InsertLog()方法的代碼嗎? – DanP 2010-09-14 11:32:07
嗨,我用InsertLog方法更新了我的帖子。它基本上抓住了我的數據上下文(這是NHibernate Session的包裝)並插入到存儲庫中。注意:我必須使用ServiceLocator而不是構造函數注入,因爲在設置數據上下文和nhibernate事件偵聽器時,我有循環引用問題。 – nfplee 2010-09-14 12:39:17
你是PK自動增量嗎?如果它是NH將如何爲它提供價值? – epitka 2010-09-14 12:43:20