2010-07-12 68 views
0

我重写了NHibernate的PreInsertEventListener,以便将实体的DateCreated属性设置为DateTime.Now。无法在NHibernate事件侦听器中设置实体属性

这里是我的代码:

public bool OnPreInsert(PreInsertEvent e) 
{ 
    DomainObject domainObject = (DomainObject) e.Entity; 
    if (domainObject.CreatedById == 0) throw new Exception("The " + domainObject.GetType().Name + " cannot be created if its CreatedById property has not been set."); 
    domainObject.DateCreated = DateTime.Now; 
    return false; 
} 

我发现,这里设置的任何实体属性(例如,呼叫上面dateCreated会)没有找到自己的方式进入由NHibernate的创建的SQL更新。有谁知道什么给了?

是的,我确信我的事件监听器正在被调用!

感谢

大卫

回答

1

嗯,看来你在这个阶段的比赛中使用特定的语法来修改实体的属性。

即语法如下所示:

Why both NHibernate OnPreInsert and OnPreUpdate methods get called for an object

请注意,我发现你不也得设置实体的属性以正常的方式为好,它这个代码。

感谢

大卫

+0

正确的,一些额外的增强我可以建议在这里: 1)使用从实体(例如dateCreated会和DateCreatedPropertyName) 公开属性和属性名的接口。 2)为包含SetProperty逻辑的拦截器使用基类(或使用助手类保持此用法一致) – DanP 2010-07-12 13:52:22

+0

感谢您的建议。我可以只问第一个理由吗? – David 2010-07-12 14:05:19

+0

@David:这允许你为可能需要它的多个实体使用拦截器,除非你确定所有的实体将使用与接口公开的完全相同的属性名称,否则属性名通常是一个好主意(因为你需要它是'set'调用的字符串版本) - 有意义吗? – DanP 2010-07-12 14:08:06