Как я реализую столбцы ChangeTime и ChangeUser с помощью NHibernate?

У вас есть 2 потребителя на канале list - активатор службы и ваш

Message message = queueChannel.receive();

Ваш метод read должен быть просто

public void read(Message<?> message)

и фреймворк будет вызывать его при каждом сообщении.

14
задан Mikael Sundberg 15 February 2009 в 22:08
поделиться

4 ответа

Необходимо зарегистрировать слушателя пред вставка и пред события обновления. Можно сделать это через конфигурацию как так:

<hibernate-configuration>
    ...
    <event type="pre-update">
        <listener class="MyListener, MyAssembly"/>
    </event>
    <event type="pre-insert">
        <listener class="MyListener, MyAssembly"/>
    </event>
</hibernate-configuration>

и затем реализуйте слушателя - что-то вроде этого (не могло бы быть совершенно точным - списанный моя память):

public class MyListener : IPreUpdateEventListener, IPreInsertEventListener
{
    public bool OnPreUpdate(PreUpdateEvent evt)
    {
        if (evt.Entity is IHasLastModified)
            UpdateLastModified(evt.State, evt.Persister.PropertyNames);

        return false;
    }

    public bool OnPreInsert(PreInsertEvent evt)
    {
        if (evt.Entity is IHasLastModified)
            UpdateLastModified(evt.State, evt.Persister.PropertyNames);

        return false;
    }

    void UpdateLastModified(object[] state, string[] names)
    {
        var index = Array.FindIndex(names, n => n == "LastModified");

        state[index] = DateTime.Now;
    }
}

и сделайте то же самое с пред событие обновления.

Править: Этот заботится о вставке, а также обновлении, и это, кажется, работает.

14
ответ дан 1 December 2019 в 13:10
поделиться

Ответ Mookid правильный, хотя я хотел бы отметить, что если используется архитектура S # arp, конфигурация NHib должна быть настроена следующим образом:

<hibernate-configuration>
    <session-factory>
    ...
        <event type="pre-update">
            <listener class="MyListener, MyAssembly"/>
        </event>
        <event type="pre-insert">
            <listener class="MyListener, MyAssembly"/>
        </event>
    </session-factory>
</hibernate-configuration>

Элементы событий входят в элемент session-factory.

1
ответ дан 1 December 2019 в 13:10
поделиться

Hey I just had to solve this on a project I am working on, here is my answer

public interface IDateModified
{
    DateTime Created { get; set; }
    DateTime Modified { get; set; }
}

public class CustomDefaultSaveOrUpdateEventListener 
    : DefaultSaveOrUpdateEventListener
{
    protected override object EntityIsPersistent(SaveOrUpdateEvent evt)
    {
        var entity = evt.Entity as IDateModified;
        if (entity != null)
        {
                entity.Modified = DateTime.Now;
        }

        return base.EntityIsPersistent(evt);
    }

    protected override object EntityIsTransient(SaveOrUpdateEvent evt)
    {
        var entity = evt.Entity as IDateModified;
        if (entity != null)
        {
            entity.Created = entity.Modified = DateTime.Now;
        }

        return base.EntityIsTransient(evt);
    }
}

Then in my configuration (I am using Fluent NHibernate to configure my unit tests in code)

configuration.EventListeners.SaveOrUpdateEventListeners 
= new ISaveOrUpdateEventListener[]
{
    new CustomDefaultSaveOrUpdateEventListener() 
};

AWESOMENESSSSSSSS!

5
ответ дан 1 December 2019 в 13:10
поделиться

Instead of using LIsteners, you can also use Interceptors: Audit changes using interceptor

0
ответ дан 1 December 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: