如何在NHibernate更新/插入实体时设置一些特殊的列值,而不需要通过扩展域类来添加特殊属性?
例如,每个表都包含像CreatedBy、CreatedDate、UpdatedBy、UpdatedDate这样的审计列。但我不想将这些属性添加到域类中。我希望尽可能地保持域模型的持久性无关因素。
如何在NHibernate更新/插入实体时设置一些特殊的列值,而不需要通过扩展域类来添加特殊属性?
例如,每个表都包含像CreatedBy、CreatedDate、UpdatedBy、UpdatedDate这样的审计列。但我不想将这些属性添加到域类中。我希望尽可能地保持域模型的持久性无关因素。
private IDictionary _infrastructureProperties = new Dictionary<object, object>();
2) 在类映射中添加了以下部分:
<dynamic-component name='_infrastructureProperties' access='field'>
<property name='CreateBy' column='CreatedBy' />
<property name='CreateDate' column='CreatedDate' />
</dynamic-component>
3)实现了一个拦截器,该拦截器设置这些属性的值。
4)可选。我们还可以实现一种配置方式,用于指定每个类在应用程序中所扮演的“角色”,然后在拦截器中使用特定于角色的属性。例如,此配置可能表明Product是TenantScopeObject,并且拦截器将设置名为TenantID的属性,其值为当前租户标识已登录系统。
对于搜索引擎的旅行者,请注意,使用NH v2.0及更高版本,使用事件监听器来完成这个任务非常简洁:
示例:
手册:
http://knol.google.com/k/fabio-maulo/nhibernate-chapter-11-interceptors-and/1nr4enxv3dpeq/14
http://ayende.com/Blog/archive/2008/07/31/Entities-dependencies-best-practices.aspx
使用NHibernate的ICompositeUserType映射时间戳数据以及在NHibernate中创建时间戳拦截器
我发现这些文章非常有用。显然,因为你受到NH/SQL的限制,它不是PI。
大多数IoC容器现在都带有拦截器,所以您可以拦截更改并将其排队。如果UoW刷新您的更改,则还可以持久化您的审计跟踪。
这与"不添加这些属性"不同,但是上次我看到工程师解决了这个问题,通过实现具体的 NHibernate 类并从一个共同的抽象基类(例如 MyAuditable)派生它们来解决。这个抽象基类实现了你不喜欢的属性。这样,你只需要解决一次这个问题。