使用 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
,但是 PreUpdateEvent
和 PostUpdateEvent
类的 Entity
属性似乎仅引用新的实体状态。
这是我目前所拥有的:
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);
如果这不起作用,您始终可以使用不同的 session 从数据库加载对象。
关于database - 使用 NHibernate 事件监听器模拟 AFTER UPDATE ... FROM DELETED 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5779896/