2009-03-25 10 views
9

j'ai une entité personne contenant une adresse comme un objet de valeur:objets de valeur NULL dans 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); 
    }); 
} 

Il indique dans les NHibernate docs que si toutes les propriétés d'un objet de valeur (Adresse1, Adresse2, etc.) sont null, le composant entier sera mappé en tant que null (ie Person.Address sera null). Cela me donne des problèmes dans les cas où tous les champs d'adresse sont nuls parce que dans mes pages où je pourrais avoir (je fais ASP MVC):

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

Cela rompt avec une exception de référence null. Donc je cherche une manière propre de placer l'adresse comme un nouvel objet Address() plutôt que null si tous les champs sont vides quand je charge une personne de la base de données sans le faire manuellement. J'ai réduit les idées suivantes:

Faire la vérification null à mon avis (pouah, horribles)

champs Faire de la base de données non-nullable (je traite avec une base de données existante)

Toute personne des idées ?

Répondre

2

Je n'ai pas de réponses définitives en créant un accesseur de méthode/propriété qui n'est pas mappé, et qui retourne un objet par défaut/null si l'adresse réelle est null.

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

ou similaire à la première, créer une enveloppe pour votre Address que vous utilisez dans la vue.

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

Devient très moche dès que vous avez réellement besoin d'éditer l'adresse dans l'interface utilisateur, pas seulement le montrer, hein? – alex

+0

Oui, j'ai une meilleure suggestion? –

+0

Bonnes idées, merci! Modification de l'accesseur de la propriété Address mappé pour permettre get et set comme d'habitude, mais en utilisant votre vérification null dans le get "Adresse ?? new Address();" travaux. Je peux maintenant charger et éditer des adresses même si elles sont nulles, sans modifier ma vue, et hiberner ne se confond pas. –

5

Merci aux idées de James (voir sa réponse et les commentaires) j'ai modifié la propriété Adresse de mon entité Personne de:

public virtual string Address { get; set; } 

à:

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

Cela a résolu mon problème, cela fonctionne, et il semble fonctionner avec NHibernate. Yey!

0

Dans certains cas, il est très facile d'écrire un type personnalisé NHibernate. Au lieu de définir le composant sur null, il retournera l'objet nul. Je l'ai fait dans certains cas, alors vous pouvez oublier les nulls.

Example of a composite user type.

Questions connexes