C# 将事件添加到级联更新
我在我的应用程序中使用fluent NHinernate和cascade all选项 我有一个复杂的模型,里面有很多实体和关系。所有东西都由一个实体(合同)持有,它有一些其他实体的集合。这些实体引用了其他实体/实体列表 当我想保存整件事时,我只是这样做:C# 将事件添加到级联更新,c#,.net,nhibernate,C#,.net,Nhibernate,我在我的应用程序中使用fluent NHinernate和cascade all选项 我有一个复杂的模型,里面有很多实体和关系。所有东西都由一个实体(合同)持有,它有一些其他实体的集合。这些实体引用了其他实体/实体列表 当我想保存整件事时,我只是这样做: mySession.Save(myContract); myTransaction.Commit() 工作正常,通过级联保存所有实体 问题是我需要在更新时设置属性ModifiedBy、ModifiedTime等。如何执行此操作?最简单的方法是
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());
根据您管理会话的方式,etc将取决于它的位置,并且由于
AuditInterceptor
没有状态,因此它可以作为一个单体存在,而不必担心多线程问题。是否可以确定实体是否正在保存或更新?是,根据实体是新的还是脏的,您还可以覆盖一些其他方法。当我使用这个拦截器时,cascade不再自动设置外键。有解决方法吗?你使用的是什么版本的NHibernate?我已经有一段时间没有使用它了,这与我之前所做的类似,但那是在版本2上。不知道为什么这会干扰外键。我使用的是版本:3.3.1.4000,运行时版本:v2.0.50727