Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将事件添加到级联更新_C#_.net_Nhibernate - Fatal编程技术网

C# 将事件添加到级联更新

C# 将事件添加到级联更新,c#,.net,nhibernate,C#,.net,Nhibernate,我在我的应用程序中使用fluent NHinernate和cascade all选项 我有一个复杂的模型,里面有很多实体和关系。所有东西都由一个实体(合同)持有,它有一些其他实体的集合。这些实体引用了其他实体/实体列表 当我想保存整件事时,我只是这样做: mySession.Save(myContract); myTransaction.Commit() 工作正常,通过级联保存所有实体 问题是我需要在更新时设置属性ModifiedBy、ModifiedTime等。如何执行此操作?最简单的方法是

我在我的应用程序中使用fluent NHinernate和cascade all选项

我有一个复杂的模型,里面有很多实体和关系。所有东西都由一个实体(合同)持有,它有一些其他实体的集合。这些实体引用了其他实体/实体列表

当我想保存整件事时,我只是这样做:

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