【问题标题】:NHibernate set properties automatically on saveNHibernate 在保存时自动设置属性
【发布时间】:2009-07-20 13:53:22
【问题描述】:

我正在使用 DDD 和 NHibernate 来持久化我的域对象。在我的数据库中,与实体相关的每个表都有四个额外的列(CreatedBy、UpdatedBy、CreatedDate、UpdatedDate)用于审计跟踪。我正在使用只允许保存聚合根的存储库模式。当 NHibernate 尝试将实体保存在聚合根上时,我收到 SQL DateTime 错误,因为实体没有设置其审核属性。 NHibernate 有没有办法在保存之前设置对象的属性?

这是一个小例子。我有一个 Order 对象,它是聚合根。我也有 OrderNote 对象,它们是订单的孩子。当我将 OrderNote 添加到订单然后保存订单时,会引发异常,因为 CreatedDate/UpdatedDate 设置为 DateTime.MinValue,这将导致 SQL DateTime 溢出。由于这些审计列是持久性的一部分并且与问题域无关,因此我不希望 Order 聚合根在添加注释时设置这些属性。审计列/属性应该只被持久性框架而不是域知道。我希望能够告诉 NHibernate 在保存或更新时设置这些属性。有没有办法做到这一点?

【问题讨论】:

    标签: .net nhibernate persistence


    【解决方案1】:

    拦截器可以这样做:

    http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors(9.10,链接并不总是有效)。

    从文档中剪切/粘贴:

    public class AuditInterceptor : IInterceptor
    {
        ...
    
        public boolean OnSave(object entity,
                              object id,
                              object[] state,
                              string[] propertyNames,
                              IType[] types)
        {
            if ( entity is IAuditable )
            {
                for ( int i=0; i<propertyNames.Length; i++ )
                {
                    if ( "CreateTimestamp" == propertyNames[i] )
                    {
                        state[i] = DateTime.Now;
                        return true;
                    }
                }
            }
            return false;
        }
    
    }
    

    OnFlushDirty() 可用于更新日期。

    您将希望每个具有 CreatedDate/UpdatedDate 的实体都实现一个接口,以便拦截器可以检查它是否应该采取行动(在提供的示例中,它是 IAuditable)。


    编辑

    刚刚注意到第 11 章:拦截器和事件。您可以从 EmptyInterceptor 继承,如果您只需要重写一些方法,这会使事情变得更容易。

    我从未使用过事件。

    【讨论】:

    • 太棒了。这正是我正在寻找的。我是 NHibernate 的新手,不知道这个功能。我确实有一个使用受保护属性实现的 IAuditable 接口,因此域看不到它们。
    【解决方案2】:

    您还可以查看 NHibernate 的版本控制系统,它可以在您的情况下为您提供帮助;)

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多