NHibernate,审核和计算列值
通过NHibernate更新/插入实体时,如何在不扩展具有特殊属性的域类的情况下设置一些特殊的列值?
例如。每个表都包含审核列,例如CreatedBy,CreatedDate,UpdatedBy,UpdatedDate。但是我不想将这些属性添加到域类中。我想将域modedl的" Percistence Ignorance"因子保持尽可能高。
解决方案
这与"不添加这些属性"不同,但是我最后一次看到这个问题时,工程师通过实现具体的NHibernate类并从实现了我们不喜欢的属性的通用抽象基类(例如MyAuditable)中派生了解决方法。这样,我们只需解决一次问题。
我们可能想尝试查看NHibernate的IUserType。
在下一页的底部是一个示例,其中ayende从实体中删除了一些加密逻辑,并允许NHibernate照顾它。
http://ayende.com/Blog/archive/2008/07/31/Entities-dependencies-best-practices.aspx
经过几个小时的NHibernate攻击,我找到了一个折衷的解决方案,该解决方案是如何将域层类与基础结构层隔离。以下列表中的第一点是这里的"受害者":
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的属性。
使用NHibernate的ICompositeUserType和
在NHibernate中创建时间戳拦截器
我发现这些文章很有用。显然,它不是PI,因为我们与NH / SQL有联系。
现在,大多数IoC容器都随附有拦截器,因此我们可以拦截更改并将其排队。如果UoW刷新了更改,那么我们也可以保留审核记录。