Question

J'ai une entité personne contenant une adresse comme un objet de valeur:

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 documents NHibernate que si toutes les propriétés d'un objet de valeur (Address1, Address2 etc) sont nulles, l'ensemble du composant seront mappés comme nulle (à savoir Person.Address sera nul). 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 suis à la recherche d'un moyen propre de définir l'adresse comme une nouvelle adresse () objet plutôt que nul si tous les champs sont vides lorsque 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 (beurk, horrible)

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

Quelqu'un at-il des idées?

Était-ce utile?

La solution

Je n'ai pas de réponses définitives créant une méthode accesseur / propriété qui ne sont pas mis en correspondance, et qui retourne une valeur par défaut / null objet si l'adresse réelle est nulle.

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

Autres conseils

Merci aux idées de James (voir sa réponse et les commentaires) j'ai modifié la propriété Adresse de mon entité Person 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, il fonctionne, et il semble fonctionner avec NHibernate. Yey!

Dans certains cas, il est très facile d'écrire un type personnalisé NHibernate. Au lieu de fixer le composant à zéro, il retournerait l'objet nul. Je l'ai fait dans certains cas, alors vous pouvez oublier les valeurs NULL.

l'exemple d'un type composite utilisateur .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top