Pregunta

Tengo una entidad persona que contiene una dirección como un 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);
    });
}

Se afirma en la documentación de NHibernate que si todas las propiedades de un objeto de valor (Address1, Dirección 2 etc) son nulos, todo el componente se va a proyectar como nulo (es decir Person.Address será nulo). Este soy yo dando problemas en los casos en todos los campos de dirección son nulas porque en mis páginas en las que pueda tener (que estoy haciendo ASP MVC):

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

Esto rompe con una excepción de referencia nula. Así que estoy buscando una manera limpia para establecer la dirección como una nueva dirección () objeto en lugar de un valor nulo si todos los campos están vacíos cuando cargo una persona de la base de datos sin hacerlo manualmente. He descartado la siguientes ideas:

Si lo hace la comprobación nula en mi opinión (puaj, horrible)

Hacer campos de la base no-anulables (estoy tratando con una base de datos heredada)

Cualquier persona alguna idea?

¿Fue útil?

Solución

No tengo ninguna respuesta definitiva la creación de un descriptor de acceso método / propiedad que no está asignado, y que devuelve un / null-objeto por defecto si la dirección actual es nula.

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

O similar a la primera, crear un contenedor para su Address que se utiliza en la 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; }
  }
}

Otros consejos

Gracias a las ideas de James (véase su respuesta y los comentarios) He modificado la propiedad Dirección de mi entidad Persona de:

public virtual string Address { get; set; }

a:

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

Esto ha resuelto mi problema, funciona, y parece que funciona con NHibernate. Yey!

En algunos casos, es muy fácil escribir un tipo personalizado NHibernate. En lugar de establecer el componente a nula, devolvería el objeto nulo. Hice esto en algunos casos, puede olvidarse de los nulos.

Ejemplo de un compuesto de tipo de usuario .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top