Эмулировать ПОСЛЕ ОБНОВЛЕНИЯ ... ИЗ УДАЛЕННОГО Триггера с помощью прослушивателя событий NHibernate - PullRequest
2 голосов
/ 25 апреля 2011

С помощью прослушивателя событий NHibernate, как я могу получить доступ к предыдущему состоянию сущности при обновлении, чтобы я мог вставить замененную сущность в мою таблицу ревизий?

В SQL Server я использую следующий триггер:

CREATE TRIGGER Trg_PostChange  
    ON dbo.Posts  
AFTER UPDATE  
AS  
BEGIN  
    SET NOCOUNT ON;  
    INSERT INTO [PostRevisions]  
        (...) -- columns here
    SELECT RevisionId = newid(),  
        ... -- columns here
    FROM DELETED -- contains the previous row column values
END

Я реализовал PostUpdateEventListener, но похоже, что свойство Entity классов PreUpdateEvent и PostUpdateEvent относится только к новому состоянию сущности.

Вот что у меня есть:

public class PostEventListener : IPostUpdateEventListener
{
    public void OnPostUpdate(PostUpdateEvent eventItem)
    {
        var post = eventItem.Entity as Post;
        if (post != null)
        {
            var revision = new PostRevision((Post)eventItem.Entity);
            eventItem.Session.Save(revision);
        }
    }
}

Очевидно, OldState должен содержать предыдущие значения, но это похоже на миссию, чтобы отобразить обратно на объект. Есть ли более простой способ?

1 Ответ

0 голосов
/ 26 апреля 2011

Вы можете попробовать использовать EntityPersister, например, так:

eventItem.Persister.Load(post.Id, null, LockMode.None, eventItem.Session);

Если это не сработает, вы всегда можете использовать другой сеанс для загрузки объекта из БД.

...