【问题标题】:Emulate AFTER UPDATE ... FROM DELETED Trigger with NHibernate Event ListenerEmulate AFTER UPDATE ... FROM DELETED 使用 NHibernate 事件监听器触发
【发布时间】:2011-08-12 09:37:57
【问题描述】:

使用 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 应该包含先前的值,但它似乎是映射回对象的任务。有没有更简单的方法?

【问题讨论】:

    标签: database nhibernate fluent-nhibernate triggers event-listener


    【解决方案1】:

    你可以尝试使用EntityPersister,像这样:

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

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

    【讨论】:

    • eventItem.Persister.Load(...)eventItem.Session.Get<Post>(post.Id) 不同吗?
    • 我相信它会调用数据库,但如果它没有,那么我认为你唯一的选择是使用不同的会话。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2011-07-05
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多