2008-09-18 105 views
4

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

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

回答

0

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

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中使用特定于角色的属性。例如。这个配置可能会声明产品是TenantScopeObject,并且拦截器会将当前租户身份值中名为TenantID的属性设置为记录在系统中。

+0

你能指出我你的方法的完整样本? – 2009-03-23 09:23:46