【问题标题】:Can I tell NHibernate not to save certain objects?我可以告诉 NHibernate 不要保存某些对象吗?
【发布时间】:2011-12-01 13:38:48
【问题描述】:

我使用 NHibernate 和 NullObject 模式来简化我的视图。 我使用 James Gregory 找到的解决方案 here

public Address GetAddressOrDefault()
{
  return Address ?? new NullAddress();
}

而且 Person 有一个 Address 属性等等......

在我尝试为没有地址的人保存我的 Person 对象之前,这非常有效。由于我创建了 NullPerson 对象的新实例,NHibernate 将尝试保存它。并给我这个:

ids for this class must be manually assigned before calling save():

有什么方法可以让 NHibernate 不尝试保存我的 NullObjects?或者我还有什么其他方法可以攻击这个吗?

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate null-object-pattern


    【解决方案1】:

    此事件在 Save 或 SaveOrUpdate 时触发。您也许可以做的是创建自己的 SaveOrUpdate 侦听器,然后将所有 NullObjects 设置回 null。

    public class MySaveOrUpdateEventListener : ISaveOrUpdateEventListener
    {
        public void OnSaveOrUpdate(SaveOrUPdate @event)
        {
            if (@event.entity is Person)
            {
                var person = (Person)@event.entity;
                if (person.Address is NullAddress)
                    person.Address = null;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我知道您可能已经考虑过这个,但最简单的解决方案似乎与

      相反
      public Address GetAddressOrDefault()
      {
        return Address ?? new NullAddress();
      }
      

      即,在您的保存调用之前:

      public Address GetAddressOrNull(Address address)
      {
        return address is NullAddress ? null : address;
      }
      

      或者...如果事情变得更复杂,您可能会考虑为您的 ViewModel 使用专用类,并使用 AutoMapper 来完成猴子工作。

      【讨论】:

      • 感谢您的精彩回答。恐怕在保存或为 ViewModel 制作专用类之前要进行大量工作。但你可能是对的,这可能是我唯一的解决方案。我的真实代码比仅包含人员和地址的示例要复杂一些。我有大约 50 个不同的对象,属性是这些对象的集合。
      • 我看过 IUserType 和这个 stackoverflow 问题:stackoverflow.com/questions/242022/… 它可能会帮助您保存空对象,但如果它是一个真实的地址。最后的解决方案是修改 NHibernate 源代码并添加一个注入器来实现您所需要的(或者您可能会在浏览源代码时遇到另一个解决方案!)
      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多