使用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应该包含先前的值,但似乎要映射回一个对象。有更简单的方法吗?

最佳答案

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

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

如果这不起作用,则始终可以使用不同的会话从数据库加载对象。

10-08 16:28