使用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
应该包含先前的值,但似乎是一个映射回对象的任务。有更简单的方法吗?
答案 0 :(得分:0)
您可以尝试使用EntityPersister,如下所示:
eventItem.Persister.Load(post.Id, null, LockMode.None, eventItem.Session);
如果这不起作用,您始终可以使用其他会话从db加载对象。