Fluent nhibernate NHibernate中的空值对象

Fluent nhibernate NHibernate中的空值对象,fluent-nhibernate,null,nhibernate-mapping,value-objects,Fluent Nhibernate,Null,Nhibernate Mapping,Value Objects,我有一个person实体,其中包含一个地址作为值对象: public Person() { WithTable("Person"); Id(x => x.Id); Component<Address>(x => x.Address, a => { a.Map(x => x.Address1); a.Map(x => x.Address2); a.Map(x => x.A

我有一个person实体,其中包含一个地址作为值对象:

public Person()
{
    WithTable("Person");
    Id(x => x.Id);
    Component<Address>(x => x.Address, a =>
    {
        a.Map(x => x.Address1);
        a.Map(x => x.Address2);
        a.Map(x => x.Address3);
        a.Map(x => x.Town);
        a.Map(x => x.Postcode);
    });
}
公众人物()
{
WithTable(“人”);
Id(x=>x.Id);
组件(x=>x.地址,a=>
{
a、 Map(x=>x.Address1);
a、 Map(x=>x.Address2);
a、 Map(x=>x.Address3);
a、 地图(x=>x.Town);
a、 地图(x=>x.邮政编码);
});
}
它在NHibernate文档中声明,如果值对象(Address1、Address2等)的所有属性都为null,则整个组件将映射为null(即Person.Address为null)。在所有地址字段都为空的情况下,这会给我带来问题,因为在我的页面中,我可能有(我正在进行ASP MVC):

x.Address.Address1))%>
这会因空引用异常而中断。因此,我正在寻找一种干净的方法,将Address设置为一个新的Address()对象,而不是当我从数据库中加载一个人时,如果所有字段都为空,则不需要手动执行该操作。我已经打消了以下想法:

在我的视图中执行空检查(yuk,可怕)

使数据库字段不可为空(我正在处理遗留数据库)


有人有什么想法吗?

我没有任何明确的答案来创建一个未映射的方法/属性访问器,如果实际地址为空,它将返回一个默认/空对象

public Address GetAddressOrDefault()
{
  return Address ?? new NullAddress();
}
或者与第一个类似,为您在视图中使用的
地址
创建一个包装器

public class AddressViewData
{
  private Address address;

  public AddressViewData(Address address)
  {
    this.address = address ?? new NullAddress();
  }

  // expose all address properties as pass-throughs
  public string Street
  {
    get { return address.Street; }
  }
}
由于James的想法(参见他的回答和评论),我已将我的个人实体的Address属性修改为:

public virtual string Address { get; set; }
致:


这解决了我的问题,它有效,而且似乎与NHibernate有效。是的

在某些情况下,编写NHibernate自定义类型非常容易。它将返回null对象,而不是将组件设置为null。我在某些情况下这样做了,然后你可以忘记空值


.

一旦你真的需要在UI中编辑地址,而不仅仅是显示地址,就会变得非常难看,是吗?是的,有更好的建议吗?好主意,谢谢!修改实际映射的地址属性访问器以允许像往常一样获取和设置,但在get“Address??new Address();”中使用null检查是可行的。我现在可以加载和编辑地址,即使它们是空的,而无需修改我的视图,hibernate也不会混淆。
public virtual string Address { get; set; }
private Address _address;
public virtual Address Address
{
    get { return _address ?? new Address(); }
    set { _address = value; }
}