【问题标题】:Cannot set entity properties in NHibernate event listener无法在 NHibernate 事件侦听器中设置实体属性
【发布时间】:2010-07-12 21:49:24
【问题描述】:

我正在重写 NHibernate 的 PreInsertEventListener 以便将实体的 DateCreated 属性设置为 DateTime.Now。

这是我的代码:

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。有谁知道什么给了?

是的,我已确认正在调用我的事件侦听器!

谢谢

大卫

【问题讨论】:

    标签: sql nhibernate insert save event-listener


    【解决方案1】:

    嗯,在这个游戏阶段你似乎必须使用特定的语法来修改实体的属性。

    这里演示了该语法:

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

    请注意,我发现您也不必像此代码那样以正常方式设置实体的属性。

    谢谢

    大卫

    【讨论】:

    • 正确,我可以在这里建议一些其他增强功能:1) 使用从实体公开属性和属性名称的接口(例如 DateCreated 和 DateCreatedPropertyName) 2) 为拦截器使用基类包含 SetProperty 逻辑(或使用辅助类来保持此用法一致)
    • 感谢您的建议。我可以问一下第一个的理由吗?
    • @David:这允许您将拦截器用于可能需要它的多个实体,属性名称通常是一个好主意,除非您确定所有实体都将使用完全相同的属性名称接口暴露(因为你需要一个字符串版本的'set'调用) - 有意义吗?
    • 我明白你的意思了 - 谢谢。在这种情况下,所有域对象都扩展了包含 DateCreated 属性的 DomainObject 抽象类,因此所有域对象都具有相同的属性名称。
    • 嘿!您就是回答我之前的 NHibernate 问题的那个人。谢谢,干得好!
    猜你喜欢
    • 2012-05-23
    • 2015-02-18
    • 2016-01-17
    相关资源
    最近更新 更多