使用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
应该包含先前的值,但似乎要映射回一个对象。有更简单的方法吗? 最佳答案
您可以尝试使用Entitypersister,如下所示:
eventItem.Persister.Load(post.Id, null, LockMode.None, eventItem.Session);
如果这不起作用,则始终可以使用不同的会话从数据库加载对象。