database - 使用 NHibernate 事件监听器模拟 AFTER UPDATE ... FROM DELETED 触发器

标签 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,但是 PreUpdateEventPostUpdateEvent 类的 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/

相关文章:

hibernate - 在一个 Hibernate 查询中更新多个列?

c# - 流畅的 nhibernate 查询需要很长时间才能使用分页对映射公式进行排序

nhibernate - Fluent NHibernate 一对多关系设置外键为空

asp.net - 如何覆盖记录表命名以访问 Orchard CMS 中的现有数据

asp.net-mvc - 在 Asp.Net MVC 应用程序中使用 Structuremap 将 ISession 注入(inject)我的存储库

swift - 来自 JSON 的 Realm 数据库中的条目

database - 我需要在 SQL 脚本文件中自动执行 SQL Azure 数据库备份。我怎样才能这样做?

sql - 如何用 R 分析维基百科文章数据库?

mysql - 用户验证值-存储在哪里

nhibernate - 如何使用 NHibernate 创建多列索引或唯一约束