Pergunta

Eu tenho uma entidade pessoa contendo um endereço como um objeto de valor:

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

Afirma nos docs NHibernate que se todas as propriedades de um objecto de valor (Endereço1, Endereço2 etc.) são nulos, todo o componente irá ser mapeados como nulo (isto é Person.Address será nulo). Isso está me dando problemas nos casos em que todos os campos de endereço são nulos porque em minhas páginas onde eu possa ter (eu estou fazendo ASP MVC):

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

Esta rompe com a exceção de referência nula. Então eu estou procurando uma maneira limpa para definir o endereço como um objeto novo endereço () em vez de nulo se todos os campos estão vazios quando eu carregar uma pessoa do banco de dados sem fazê-lo manualmente. Eu já descontadas as seguintes ideias:

Fazendo verificação nulo na minha opinião (yuk, horrível)

Fazendo banco de dados de campos não-nulo (eu estou lidando com um banco de dados legado)

Qualquer pessoa alguma idéia?

Foi útil?

Solução

Eu não tenho quaisquer respostas definitivas criando um acessor método / propriedade que não está mapeada e que retorna um / null-objeto padrão se o endereço real é nulo.

public Address GetAddressOrDefault()
{
  return Address ?? new NullAddress();
}

Ou semelhante ao primeiro, criar um wrapper para o seu Address que você use a vista.

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

Outras dicas

Graças às idéias de James (ver sua resposta e comentários) Eu modifiquei a propriedade Endereço da minha entidade Pessoa a partir de:

public virtual string Address { get; set; }

para:

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

Este tem resolvido o meu problema, ele funciona, e parece trabalhar com NHibernate. Yey!

Em alguns casos, é muito fácil escrever um tipo personalizado NHibernate. Em vez de definir o componente para nulo, ele retornaria o objeto nulo. Eu fiz isso em alguns casos, em seguida, você pode esquecer nulos.

Exemplo de um tipo de utilizador compósito .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top