2009-03-25 13 views
9

que tienen una entidad persona que contiene una dirección como un objeto de valor:objetos de valor nulo en 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); 
    }); 
} 

Se afirma en los documentos de NHibernate que si todas las propiedades de un objeto de valor (Dirección 1, Dirección 2, etc) son null, todo el componente se mapeará 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 forma limpia de configurar la dirección como un nuevo objeto Address() en lugar de null si todos los campos están vacíos cuando cargo una persona desde la base de datos sin hacerlo manualmente. He descartado la siguientes ideas:

Haciendo comprobación nula en mi punto de vista (yuk, horrible)

Realización de campos de bases de datos no-anulables (estoy tratando con una base de datos heredada)

Cualquier persona alguna idea ?

Respuesta

2

No tengo respuestas definitivas para crear un método/acceso a la propiedad que no esté correlacionado, y que devuelva un valor por defecto/objeto nulo si la dirección real 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; } 
    } 
} 
+0

Se pone muy feo tan pronto como realmente necesitas editar la dirección en la interfaz de usuario, no solo mostrarlo, ¿eh? – alex

+0

Sí, tengo una mejor sugerencia? –

+0

¡Buenas ideas, gracias! Modificar el acceso a la propiedad Dirección asignada real para permitir obtener y establecer como de costumbre, pero utilizando su verificación nula en el obtener "Dirección? Nueva dirección();" trabajos. Ahora puedo cargar y editar direcciones incluso si son nulas, sin modificar mi vista, y la hibernación no se confunde. –

5

Gracias a las ideas de James (véase su respuesta y los comentarios) que han 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 solucionado mi problema, funciona, y parece funcionar con NHibernate. ¡Yey!

0

En algunos casos, es muy fácil escribir un tipo personalizado NHibernate. En lugar de establecer el componente como nulo, devolvería el objeto nulo. Lo hice en algunos casos, entonces puedes olvidarte de los nulos.

Example of a composite user type.

Cuestiones relacionadas