Domanda

Ho un soggetto persona che contiene un indirizzo come un oggetto di valore:

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

Si afferma nella documentazione NHibernate che se tutte le proprietà di un oggetto valore (Address1, Address2 ecc) sono nulli, l'intero componente viene mappato come nullo (cioè Person.Address sarà nullo). 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 riferimento nullo. Quindi sto cercando un modo pulito per impostare l'indirizzo di un nuovo indirizzo () oggetto piuttosto che nullo se tutti i campi sono vuoti quando carico una persona dal database senza farlo manualmente. Ho scontato le seguenti idee:

Fare verifica nulla a mio avviso (bleah, orribile)

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

Chiunque tutte le idee?

È stato utile?

Soluzione

Non ho risposte definitive creando una funzione di accesso metodo / proprietà che non è mappata, e che restituisce un / null-oggetto di default, se l'indirizzo effettivo è nullo.

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

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

Altri suggerimenti

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 di lavorare con NHibernate. Yey!

In alcuni casi è molto facile scrivere un tipo personalizzato NHibernate. Invece di impostare la componente nullo, sarebbe restituire l'oggetto nullo. Ho fatto questo in alcuni casi, allora si può dimenticare i valori nulli.

Esempio di un composito di tipo utente .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top