2009-03-25 14 views
9

ho un'entità persona che contiene un indirizzo come un oggetto di valore:Null oggetti di valore in 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); 
    }); 
} 

Essa afferma nella documentazione NHibernate che se tutte le proprietà di un oggetto di valore (Indirizzo1 Indirizzo2 ecc) sono null, l'intero componente verrà mappato come null (cioè Person.Address sarà null). Si tratta di avermi dato problemi nel caso in cui tutti i campi di indirizzo sono nulle perché nei miei pagine dove potrei avere (che sto facendo ASP MVC):

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

Questo rompe con un'eccezione di riferimento null. Quindi sto cercando un modo pulito per impostare Address come nuovo oggetto Address() anziché null se tutti i campi sono vuoti quando carico una persona dal database senza farlo manualmente. Ho scontato le seguenti idee:

Fare controllo nullo, a mio avviso (bleah, orribile)

Fare campi di database non-nullable (ho a che fare con un database legacy)

Chiunque tutte le idee ?

risposta

2

Non ho risposte definitive che creino un metodo/proprietà accessor che non è mappato e che restituisce un oggetto null/predefinito se l'indirizzo effettivo è nullo.

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

o simile al primo, creare un wrapper per il vostro Address che si utilizza nella 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

Diventa piuttosto brutto non appena è effettivamente necessario modificare l'indirizzo nell'interfaccia utente, non solo mostrarlo, eh? – alex

+0

Sì, hai un suggerimento migliore? –

+0

Grandi idee, grazie! Modificando l'effettivo accessor della proprietà Address mappato per consentire di ottenere e impostare come al solito, ma usando il check null nel get "Indirizzo ?? nuovo indirizzo();" lavori. Ora posso caricare e modificare gli indirizzi anche se sono nulli, senza modificare la mia vista e l'ibernazione non viene confusa. –

5

Grazie alle idee di James' (vedi la sua risposta e commenti) ho modificato la proprietà Indirizzo della mia entità persona da:

public virtual string Address { get; set; } 

a:

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

Questo ha risolto il mio problema, funziona, e sembra funzionare con NHibernate. Yey!

0

In alcuni casi è molto semplice scrivere un tipo personalizzato NHibernate. Invece di impostare il componente su null, restituirebbe l'oggetto nullo. L'ho fatto in alcuni casi, quindi puoi dimenticarti di null.

Example of a composite user type.

Problemi correlati