4

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

例如,每个表都包含审计列,如 CreatedBy、CreatedDate、UpdatedBy、UpdatedDate。但我不想将这些属性添加到域类中。我想保持域模型 Percistence Ignorance 尽可能高。

4

5 回答 5

1

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

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

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

于 2008-09-18T23:20:12.900 回答
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) 可选。我们也可以通过配置每个类在应用程序中扮演的“角色”来实现一种设置,然后在拦截器中使用角色特定的属性。例如,此配置可能声明 Product 是 TenantScopeObject 并且拦截器将在当前租户身份的值中设置名为 TenantID 的属性记录在系统中。

于 2008-09-19T10:47:22.217 回答
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

于 2011-04-18T23:22:16.587 回答
0

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

于 2008-09-18T22:26:33.667 回答
0

使用 NHibernate 的 ICompositeUserType 映射时间戳数据在 NHibernate 中创建时间戳拦截器

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

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

于 2009-01-26T23:50:43.960 回答