10

我有一个包含地址作为值对象的人员实体:

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);
    });
}

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

<%= Html.TextBoxFor((x => x.Address.Address1))%>

这会因空引用异常而中断。因此,我正在寻找一种干净的方法来将 Address 设置为新的 Address() 对象,而不是 null 如果当我从数据库中加载 Person 时所有字段都为空而不手动执行。我打折了以下想法:

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

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

有人有什么想法吗?

4

3 回答 3

5

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

public virtual string Address { get; set; }

到:

private Address _address;
public virtual Address Address
{
    get { return _address ?? new Address(); }
    set { _address = value; }
}

这解决了我的问题,它有效,而且它似乎适用于 NHibernate。耶!

于 2009-03-26T09:17:40.307 回答
2

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

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

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; }
  }
}
于 2009-03-25T19:50:56.377 回答
0

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

复合用户类型的示例

于 2010-12-02T15:31:14.143 回答