许多人对NHibernate做的一件很常见的事情是在保存实体时设置审计字段(例如CreatedDate,LastModifiedDate)。关于如何使用NHibernate事件进行此类操作有很多博客文章。
这个使用SaveUpdate事件: http://www.codinginstinct.com/2008/04/nhibernate-20-events-and-listeners.html
这个使用PreInsert和PreUpdate事件: http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx
SaveUpdate感觉这是一个更好的地方,我猜这是大多数人倾向于这样做的地方。这是问题所在:我将一对多关系设置为cascade =“save-update”。当我保存父实体时,它通过SaveUpdate事件运行所有子实体。但是当我在那里设置审计字段时,它只是使子实体变脏了!现在它总是更新子集合中的每一行。
我可以将审计移到PreInsert / PreUpdate,但后来我遇到了其他问题(我正在使用NHibernate Validator进行验证,它为模式导出的列设置了约束,因此NHibernate甚至没有进入PreInsert,因为审计字段为空,db列不为空列。
对我来说,最简单的解决方法是,如果有一种方法可以在SaveUpdate中设置审计字段而不会使我的对象变脏。我不知道这是否可能。
有什么建议吗?我确定有人遇到过这个问题。
答案 0 :(得分:2)
我想说,SaveUpdate不是正确的地方,因为它会遇到此触发器,即使它没有保存或更新实体。
您需要一个触发器,只有当实体已被NH声明为脏时才会调用。这很可能是PreInsert和PreUpdate。
我看到验证器遇到的问题。问题不在于NH认为这些属性的变化会使实体变脏。问题是验证器过早地验证了这个属性。
如果您无法参数化验证器以跳过这些值,您可以使用此解决方法解决它: