NHibernate的审计 - PostInsert不工作
我的应用有以下实体: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表中为空。我玩过几个不同的变体,但似乎没有任何工作。
我真的很感激,如果有人能告诉我如何做到这一点。谢谢
解决方法张贴在问题的评论。我只需要使用:
@event.Session.GetSession(NHibernate.EntityMode.Poco).Save(...);
保存用户而不是访问存储库。
注意到我的更改没有持续。显式调用Flush()帮助在发布DanP后提到。 http://groups.google.com/group/nhusers/msg/1b09a4f1583da646 – 2011-04-22 16:59:36
GetSession方法的目的是什么?这解决了我的问题,但不知道为什么。 – 2016-06-25 02:37:10
我不确定要告诉你实情。我刚接受它的工作。 – nfplee 2016-06-27 07:58:07
你可以发布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