10 Stimmen

Nullwert-Objekte in NHibernate

Ich habe eine Personenentität, die eine Adresse als Wertobjekt enthält:

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

In den NHibernate-Dokumenten heißt es, dass, wenn alle Eigenschaften eines Wertobjekts (Adresse1, Adresse2 usw.) Null sind, die gesamte Komponente als Null abgebildet wird (d. h. Person.Adresse ist Null). Dies gibt mir Probleme in Fällen, in denen alle Adressfelder null sind, weil in meinen Seiten, in denen ich haben könnte (ich bin tun ASP MVC):

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

Dies führt zu einer Null-Referenz-Ausnahme. Ich bin also auf der Suche nach einem sauberen Weg, um Adresse als ein neues Adresse()-Objekt statt null, wenn alle Felder leer sind, wenn ich eine Person aus der Datenbank laden, ohne es manuell zu tun. Ich habe die folgenden Ideen verworfen:

Nullprüfung in meiner Ansicht (igitt, schrecklich)

Datenbankfelder nicht löschbar machen (ich habe es mit einer alten Datenbank zu tun)

Hat jemand eine Idee?

5voto

James Allen Punkte 5240

Dank der Ideen von James (siehe seine Antwort und Kommentare) habe ich die Eigenschaft Address meiner Entität Person von:

public virtual string Address { get; set; }

zu:

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

Dies hat mein Problem gelöst, es funktioniert, und es scheint mit NHibernate zu funktionieren. Juhu!

2voto

James Gregory Punkte 14055

Ich habe keine endgültigen Antworten, die eine Methode/Eigenschaftszugriffsfunktion erstellen, die nicht zugeordnet ist, und die ein Standard/Null-Objekt zurückgibt, wenn die tatsächliche Adresse null ist.

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

Oder, ähnlich wie im ersten Fall, erstellen Sie einen Wrapper für Ihre Address die Sie in der Ansicht verwenden.

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

0voto

Stefan Steinegger Punkte 62197

In manchen Fällen ist es sehr einfach, einen eigenen NHibernate-Typ zu schreiben. Anstatt die Komponente auf Null zu setzen, würde sie das Null-Objekt zurückgeben. Ich habe dies in einigen Fällen getan, dann können Sie die Nullen vergessen.

Beispiel für einen zusammengesetzten Nutzertyp .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X