C# 我能告诉NHibernate不要保存某些对象吗?

C# 我能告诉NHibernate不要保存某些对象吗?,c#,nhibernate,fluent-nhibernate,null-object-pattern,C#,Nhibernate,Fluent Nhibernate,Null Object Pattern,我使用带有NullObject模式的NHibernate使视图更简单。 我使用詹姆斯·格雷戈里找到的解决方案 public Address GetAddressOrDefault() { return Address ?? new NullAddress(); } 而且这个人有地址、财产等等 在我尝试为一个没有地址的人保存Person对象之前,这是非常有效的。由于我创建了NullPerson对象的新实例,NHibernate将尝试保存它。给我这个: ids for this class m

我使用带有NullObject模式的NHibernate使视图更简单。 我使用詹姆斯·格雷戈里找到的解决方案

public Address GetAddressOrDefault()
{
  return Address ?? new NullAddress();
}
而且这个人有地址、财产等等

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

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

有没有办法让NHibernate不保存我的NullObjects?或者我还有别的方法来攻击它吗?

我知道你可能已经考虑过了,但最简单的解决方案似乎是相反的

public Address GetAddressOrDefault()
{
  return Address ?? new NullAddress();
}
即,在保存通话之前:

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

<>或……如果事情变得更复杂,并使用猴子操作,你可以考虑使用一个专用的类。

此事件在Save/SaveOrror更新中被激发。您可能要做的是创建自己的SaveOrUpdate侦听器,然后将任何NullObject设置回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;
        }
    }
}

谢谢你的回答。我担心在保存之前还原或为ViewModel创建专用类将需要大量的工作。但你可能是对的,这可能是我唯一的解决办法。我的实际代码比只包含person和address的示例要复杂一些。我有大约50个不同的对象,属性是这些对象的集合。我已经研究了
IUserType
和这个stackoverflow问题:它可能会帮助您保存空对象,但如果它是一个真实地址,您无法使它执行“正常”操作。最后的解决方案是修改NHibernate源并添加一个注入器以满足您的需要(或者您在浏览源时可能会遇到另一个解决方案!)