使用NHibernate事件监听器在UPDATE ... FROM DELETED触发器之后进行模拟

时间:2011-04-25 15:20:00

标签: database nhibernate fluent-nhibernate triggers event-listener

使用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,但似乎EntityPreUpdateEvent类的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 :(得分:0)

您可以尝试使用EntityPersister,如下所示:

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

如果这不起作用,您始终可以使用其他会话从db加载对象。