Объекты с нулевым значением в NHibernate - PullRequest
10 голосов
/ 25 марта 2009

У меня есть лицо, содержащее Address в качестве объекта значения:

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 из базы данных, не делая это вручную. Я обесценил следующие идеи:

Проверка на ноль на мой взгляд (юк, ужас)

Создание полей базы данных не обнуляемыми (я имею в виду устаревшую базу данных)

У кого-нибудь есть идеи?

Ответы [ 3 ]

5 голосов
/ 26 марта 2009

Благодаря идеям Джеймса (см. Его ответ и комментарии) я изменил свойство Address моей сущности Person с:

public virtual string Address { get; set; }

до:

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

Это решило мою проблему, оно работает и похоже работает с NHibernate. Yey!

2 голосов
/ 25 марта 2009

У меня нет четких ответов на создание метода доступа / метода, который не отображается, и который возвращает объект по умолчанию / null, если фактический адрес равен нулю.

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; }
  }
}
0 голосов
/ 02 декабря 2010

В некоторых случаях очень легко написать собственный тип NHibernate. Вместо установки компонента на ноль, он вернул бы нулевой объект. Я делал это в некоторых случаях, тогда вы можете забыть о нулях.

Пример составного типа пользователя .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...