我有含有地址为值对象的人实体:

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的文档,如果一个值对象(地址1,地址等)的所有属性都为空时,整个组件将被映射为空(即Person.Address将为空)。这是给我的问题在所有地址字段为空,因为在我的网页情况下,我可能会(我在做ASP MVC):

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

这打破了一个空引用异常。所以,我在找一个干净的方式来设置地址作为新地址()对象,而不是空,如果所有字段为空,当我从数据库装载一个人没有做手工。我已经贴现以下思路:

否则空检查在我的视图(议员,可怕的)

制作数据库字段不为空的(我处理旧的数据库)

任何任何想法?

有帮助吗?

解决方案

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

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

其他提示

由于詹姆斯的观点(见他的回答和评论)我已经修改从我个人实体的地址属性:

public virtual string Address { get; set; }

为:

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

这解决了我的问题,它的工作原理,这似乎与NHibernate工作。 Yey!

在某些情况下,它是很容易编写的NHibernate自定义类型。而不是设置组件空的,它会返回null对象。我在某些情况下这样做,那么你可以忘掉空。

复合用户类型的实施例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top