NHibernate中的空值对象

Jam*_*len 10 null nhibernate-mapping fluent-nhibernate value-objects

我有一个包含Address作为值对象的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);
    });
}
Run Code Online (Sandbox Code Playgroud)

它在NHibernate文档中指出,如果值对象(Address1,Address2等)的所有属性都为null,则整个组件将被映射为null(即Person.Address将为null).这给了我所有地址字段为空的情况下的问题,因为在我的网页中我可能有(我正在做ASP MVC):

<%= Html.TextBoxFor((x => x.Address.Address1))%>
Run Code Online (Sandbox Code Playgroud)

这打破了空引用异常.所以我正在寻找一种简洁的方法将Address设置为一个新的Address()对象而不是null,如果我从数据库加载Person而不手动操作时所有字段都是空的.我打了以下想法:

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

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

任何想法?

Jam*_*len 5

感谢James的想法(请参阅他的回答和评论),我修改了Person实体的Address属性:

public virtual string Address { get; set; }
Run Code Online (Sandbox Code Playgroud)

至:

private Address _address;
public virtual Address Address
{
    get { return _address ?? new Address(); }
    set { _address = value; }
}
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题,它的工作原理,似乎与NHibernate一起使用.Yey!


Jam*_*ory 2

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

public Address GetAddressOrDefault()
{
  return Address ?? new NullAddress();
}
Run Code Online (Sandbox Code Playgroud)

或者与第一个类似,为您Address在视图中使用的包装器创建一个。

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; }
  }
}
Run Code Online (Sandbox Code Playgroud)