Вопрос

У меня есть объект person, содержащий Адрес в качестве объекта value:

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 указано, что если все свойства объекта value (Address1, Address2 и т.д.) равны нулю, весь компонент будет отображен как null (т.Е.Лицо.Адрес будет равен нулю).Это вызывает у меня проблемы в случаях, когда все поля адреса равны нулю, потому что на моих страницах, где я мог бы иметь (я использую ASP MVC):

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

Это прерывается исключением с нулевой ссылкой.Итак, я ищу простой способ установить Address в качестве нового объекта Address(), а не null, если все поля пусты, когда я загружаю пользователя из базы данных, не делая этого вручную.Я отбросил следующие идеи:

Выполнение нулевой проверки, на мой взгляд (фу, ужасно)

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

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

Это было полезно?

Решение

У меня нет никаких окончательных ответов на создание метода доступа / свойства, который не сопоставлен и который возвращает объект по умолчанию / null, если фактический адрес равен 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; }
  }
}

Другие советы

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

public virtual string Address { get; set; }

Для:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top