将事件添加到级联更新

时间:2013-04-18 11:29:22

标签: c# .net nhibernate

我在我的应用程序中使用流畅的NHinernate并使用cascade all选项。

我有一个复杂的模型,其中包含一堆实体和关系。一切都由一个实体(合同)持有,它有一些其他实体的集合。这些实体引用了其他实体/实体列表。

当我想保存整件事时,我就这样做了:

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

工作正常,通过级联保存所有实体。

问题是我需要在更新时设置属性ModifiedBy,ModifiedTime等。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

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

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没有状态,因此它可以作为单身存在而不用担心多线程问题。