【问题标题】:NHibernate Auditing - PostInsert Not WorkingNHibernate 审计 - PostInsert 不工作
【发布时间】:2010-09-14 10:48:39
【问题描述】:

我的应用程序具有以下实体:

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 事件侦听器自动连接它。我已经设置了成功调用以下两种方法的配置:

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)
}

当我更新一条记录时,一条日志已成功插入,但当我插入一条记录时,我收到一条错误消息,告诉我用户日志表中的用户 ID 不能为空。我尝试了一些不同的变体,但似乎没有任何效果。

如果有人能告诉我如何做到这一点,我将不胜感激。谢谢

【问题讨论】:

  • 能贴出InsertLog()方法的代码吗?
  • 嗨,我已经用 InsertLog 方法更新了我的帖子。它基本上抓取了我的数据上下文(它是 NHibernate 会话的包装器)并插入到存储库中。注意:我必须使用 ServiceLocator 而不是构造函数注入,因为在设置数据上下文和休眠事件侦听器时遇到循环引用问题。
  • 你是PK自增吗?如果是这样,NH 会有什么价值呢?
  • 只是一个猜测...但是如果您要在插入 UserLog 条目之前刷新当前会话呢?我不确定你的上下文 impl 是什么样的,但如果你公开一个刷新操作,我会尝试调用它......
  • 也许您可以在此线程中找到一些指导? groups.google.com/group/nhusers/browse_thread/thread/…

标签: nhibernate fluent-nhibernate nhibernate-mapping


【解决方案1】:

在问题 cmets 中发布的解决方案。我只需要使用:

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

保存用户而不是访问存储库。

【讨论】:

  • 注意到我的更改没有持续。如 DanP 发布的帖子中所述,明确调用 Flush() 会有所帮助。 groups.google.com/group/nhusers/msg/1b09a4f1583da646
  • GetSession 方法的目的是什么?这解决了我的问题,但不知道究竟是为什么..
  • 我不确定要告诉你真相。我刚刚接受了它的工作。
猜你喜欢
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多