9

У меня есть человек объект, содержащий адрес в качестве объекта значения:объекты Нулевое значение в NHibernate

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

Doing нулевой проверки на моем взгляде (тьфу, ужасную)

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

Anyone любых идеями ?

ответ

2

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

Становится довольно уродливым, как только вам действительно нужно изменить адрес в пользовательском интерфейсе, а не просто показать его, да? – alex

+0

Да, получилось лучшее предложение? –

+0

Отличные идеи, спасибо! Изменение фактического сопоставленного свойства доступа к свойствам Адреса, чтобы разрешить get и установить как обычно, но используя нулевую проверку в get «Address? New Address();» работает. Теперь я могу загружать и редактировать адреса, даже если они являются нулевыми, без изменения моего представления, а спящий режим не путается. –

5

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

public virtual string Address { get; set; } 

к:

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

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

0

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

Example of a composite user type.