我在我的应用程序中使用流畅的NHinernate并使用cascade all选项。
我有一个复杂的模型,其中包含一堆实体和关系。一切都由一个实体(合同)持有,它有一些其他实体的集合。这些实体引用了其他实体/实体列表。
当我想保存整件事时,我就这样做了:
mySession.Save(myContract);
myTransaction.Commit()
工作正常,通过级联保存所有实体。
问题是我需要在更新时设置属性ModifiedBy,ModifiedTime等。我怎么能这样做?
答案 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
没有状态,因此它可以作为单身存在而不用担心多线程问题。