
NHibernate, auditing and computed column values通过NHibernate更新/插入实体时,如何在不扩展具有特殊属性的域类的情况下设置一些特殊的列值? 例如。 每个表都包含审核列,例如CreatedBy,CreatedDate,UpdatedBy,UpdatedDate。 但是我不想将这些属性添加到域类中。 我想保持域modedl的Percistence无知因子尽可能高。 对于搜索引擎旅人,请注意,对于NH v2.0及更高版本,现在可以很方便地使用事件侦听器执行此操作: 例: http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx 手册: http://knol.google.com/k/fabio-maulo/nhibernate-chapter-11-interceptors-and/1nr4enxv3dpeq/14 经过几个小时的NHibernate攻击后,我发现了一种折衷的解决方案,该解决方案是如何将域层类与基础结构层隔离。这里只有一个"受害者"是下面列表中的第一点: 1)我为只有一个私有字段的域中的所有可持久实体引入了基类DomainObject:
2)在类映射中添加了以下部分:
3)实现了一个拦截器,用于设置这些属性值。 4)可选。我们还可以通过配置每个类在应用程序中扮演的"角色"来实现种类设置,然后在Interceptor中使用角色特定的属性。例如。此配置可以声明Product为TenantScopeObject,拦截器将在系统中记录当前租户身份的值中设置名为TenantID的属性。 您可能想尝试查看NHibernate的IUserType。 在下一页的底部是一个示例,其中ayende从实体中删除了一些加密逻辑,并允许NHibernate照顾它。 http://ayende.com/Blog/archive/2008/07/31/Entities-dependencies-best-practices.aspx
使用NHibernate的ICompositeUserType和 我发现这些文章很有用。显然,它不是PI,因为您与NH / SQL有联系。 现在,大多数IoC容器都带有拦截器,因此您可以拦截更改并将它们排队。如果UoW刷新了您的更改,则您也可以保留审核跟踪。 这与"不添加这些属性"不同,但是我上次看到时,工程师通过实现具体的NHibernate类并从实现了您不喜欢的属性的通用抽象基类(例如MyAuditable)中派生了解决方法。这样,您只需解决一次问题。 |