Объекты с нулевым значением в NHibernate
-
22-08-2019 - |
Вопрос
У меня есть объект 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, он возвращал бы нулевой объект.Я делал это в некоторых случаях, тогда вы можете забыть о нулевых значениях.