Аудит NHibernate - PostInsert не работает - PullRequest
1 голос
/ 14 сентября 2010

Мое приложение имеет следующие объекты:

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

Когда я обновляю запись, журнал успешно вставляется, но когда я вставляю запись, я получаю сообщение об ошибке, сообщающее, что UserID не может быть пустым в таблице UsersLog. Я играл с несколькими различными вариантами, но, похоже, ничего не работает.

Я бы очень признателен, если бы кто-то показал мне, как это можно сделать. Спасибо

1 Ответ

5 голосов
/ 10 декабря 2010

Решение размещено в комментариях к вопросу. Я просто должен был использовать:

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

чтобы сохранить пользователя вместо доступа к хранилищу.

...