NHibernate,审计和计算列值

时间:2008-09-18 22:10:23

标签: c# .net nhibernate

如果在不扩展具有特殊属性的域类的情况下通过NHibernate更新/插入实体时,如何设置一些特殊列值?

E.g。每个表都包含审计列,如CreatedBy,CreatedDate,UpdatedBy,UpdatedDate。但我不想将这些属性添加到域类中。我想保持域modedl Percistence Ignorance因子尽可能高。

5 个答案:

答案 0 :(得分:1)

您可能想尝试查看NHibernate的IUserType。

在下一页的底部是ayende从实体中删除一些加密逻辑并允许NHibernate处理它的示例。

http://ayende.com/Blog/archive/2008/07/31/Entities-dependencies-best-practices.aspx

答案 1 :(得分:1)

经过几个小时的黑客攻击NHibernate后,我发现了如何保持域层类与基础架构层隔离的妥协解决方案。这里只有一个“受害者”是下面列表中的第1点:

1)我已经为域中的所有可持久实体引入了基类DomainObject,只有一个私有字段:

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)可选。此外,我们可以实现一个类型设置,配置每个类在应用程序中播放的“角色”,然后在Interceptor中使用角色特定属性。例如。此配置可能声明Product是TenantScopeObject,拦截器将在系统中记录当前租户标识值中名为TenantID的属性。

答案 2 :(得分:1)

对于使用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

答案 3 :(得分:0)

这与“不添加这些属性”不同,但是上次我看到这个时,工程师通过实现具体的NHibernate类并从实现属性的公共抽象基类(例如MyAuditable)派生它来解决它不喜欢。这样你只需要解决一次问题。

答案 4 :(得分:0)

Mapping Timestamp Data Using NHibernate's ICompositeUserTypeCreating a Timestamp Interceptor in NHibernate

我发现这些文章很有用。显然它不是PI,因为你与NH / SQL联系在一起。

现在大多数IoC容器都带有拦截器,因此您可以拦截更改并对其进行排队。如果UoW刷新您的更改,那么您也可以保留审计跟踪。