awi*_*nsk 11 .net nhibernate persistence
我正在使用DDD和NHibernate来保存我的域对象.在我的数据库中,与实体相关的每个表都有四个用于审计跟踪的额外列(CreatedBy,UpdatedBy,CreatedDate,UpdatedDate).我使用的存储库模式只允许保存聚合根.当NHibernate尝试在聚合根上保存实体时,我得到一个SQL DateTime错误,因为实体没有设置其审计属性.在保存之前,NHibernate中有没有办法在对象上设置属性?
这是一个小例子.我有一个Order对象,它是聚合根.我也有OrderNote对象,它们是订单的子项.当我向Order添加OrderNote然后保存Order时抛出异常,因为CreatedDate/UpdatedDate设置为DateTime.MinValue,这将导致SQL DateTime溢出.由于这些审计列是持久性的一部分而与问题域无关,因此我不希望订单聚合根在添加注释时设置这些属性.审计列/属性只应由持久性框架而不是域知道.我希望能够告诉NHibernate在保存或更新时设置这些属性.有没有办法做到这一点?
ano*_*ous 11
拦截器可以做到这一点:
http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors(9.10,链接并不总是有效).
从文档中剪切/粘贴:
public class AuditInterceptor : IInterceptor
{
...
public boolean OnSave(object entity,
object id,
object[] state,
string[] propertyNames,
IType[] types)
{
if ( entity is IAuditable )
{
for ( int i=0; i<propertyNames.Length; i++ )
{
if ( "CreateTimestamp" == propertyNames[i] )
{
state[i] = DateTime.Now;
return true;
}
}
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
OnFlushDirty()可用于UpdatedDate.
您将希望每个具有CreatedDate/UpdatedDate的实体都实现一个接口,以便拦截器可以检查它是否应该行动(在提供的示例中它是IAuditable).
编辑
刚刚注意到第11章:拦截器和事件.您可以从EmptyInterceptor继承,如果您只需要覆盖某些方法,这将使事情变得更容易.
我从未使用过活动.