首页 / 知识

关于c#:NHibernate,审核和计算列值

2023-04-17 10:44:00

关于c#:NHibernate,审核和计算列值

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:

1
private IDictionary _infrastructureProperties = new Dictionary<object, object>();

2)在类映射中添加了以下部分:

1
2
3
4
<dynamic-component name='_infrastructureProperties' access='field'>
  <property name='CreateBy' column='CreatedBy' />
  <property name='CreateDate' column='CreatedDate' />
</dynamic-component>

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和
在NHibernate中创建一个时间戳拦截器

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

现在,大多数IoC容器都带有拦截器,因此您可以拦截更改并将它们排队。如果UoW刷新了您的更改,则您也可以保留审核跟踪。


这与"不添加这些属性"不同,但是我上次看到时,工程师通过实现具体的NHibernate类并从实现了您不喜欢的属性的通用抽象基类(例如MyAuditable)中派生了解决方法。这样,您只需解决一次问题。


审核计算扩展实体

最新内容

相关内容

猜你喜欢