1

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

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

当我想保存整个事情时,我会这样做:

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

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

问题是我需要在更新时设置属性 ModifiedBy、ModifiedTime 等。我怎样才能做到这一点?

4

1 回答 1

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

于 2013-04-18T11:39:09.107 回答