将事件添加到级联更新

本文关键字:级联 更新 添加 事件 | 更新日期: 2023-09-27 18:09:45

我在我的应用程序中使用流利的nhinnate级联所有选项。

我有一个复杂的模型,里面有一堆实体和关系。一切都由一个实体(契约)持有,它有一些其他实体的集合。这些实体有对其他实体/实体列表的引用。

当我想保存全部内容时,我只需这样做:

mySession.Save(myContract);
myTransaction.Commit()

工作良好,保存所有的实体感谢级联。

问题是,我需要设置属性ModifiedBy, ModifiedTime等更新。我该怎么做呢?

将事件添加到级联更新

最简单的方法是为需要更新的属性创建一个接口:

public interface IAudit
{
    string ModifiedBy { get; set; }
    DateTime ModifiedTime { get; set; }
}

然后添加一个NHibernateInterceptor来更新属性:

public class AuditInterceptor : EmptyInterceptor
{
    public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
    {
        var auditableEntity = entity as IAudit;
        if (auditableEntity != null)
        {
            auditableEntity.ModifiedTime = DateTime.Now;
            // ...
        }
        return base.OnSave(entity, id, state, propertyNames, types);
    }
// ...
}

你需要告诉NHibernate使用拦截器,如果我没记错的话是这样做的:

var session = SessionFactory.OpenSession(new AuditInterceptor());

取决于你如何管理你的会话等将取决于它去哪里,因为AuditInterceptor没有状态,它可以作为一个单例存在,而不用担心多线程问题。