我可以告诉NHibernate不要保存某些对象吗?

时间:2011-12-01 13:38:48

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

我正在使用带有NullObject模式的NHibernate来使我的视图更简单。 我使用James Gregory发现的here解决方案

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

And Person有一个Address属性等等......

这是非常好的,直到我尝试为没有地址的人保存我的Person对象。由于我创建了NullPerson对象的新实例,NHibernate将尝试保存它。并告诉我:

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

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

2 个答案:

答案 0 :(得分:3)

此事件在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;
        }
    }
}

答案 1 :(得分:1)

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

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

即,在您的保存电话之前:

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

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