Frage

Ich habe eine Person Unternehmen eine Adresse als Wertobjekt enthalten:

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

Es heißt im NHibernate docs dass, wenn alle Eigenschaften eines Wertgegenstandes (Address1, Address2 etc) null sind, wird die gesamte Komponente als null abgebildet werden (d.h. Person.Address wird null sein). Dies gibt mir Probleme in Fällen, in denen alle Adressfelder null sind, weil in meinen Seiten, wo ich haben könnte (ich tue ASP MVC):

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

Dies bricht mit einer Null-Referenz Ausnahme. Also ich bin auf der Suche nach einem sauberen Weg Adresse als eine neue Adresse () Objekt eher als null, wenn alle Felder leer sind, wenn ich eine Person aus der Datenbank laden, ohne es manuell zu tun. Ich habe folgende Ideen diskon:

Doing null Überprüfung meiner Meinung nach (igitt, schrecklich)

Erstellen von Datenbankfeldern nicht-nullable (I mit einer Legacy-Datenbank zu tun habe)

Wer irgendwelche Ideen?

War es hilfreich?

Lösung

Ich habe keine endgültigen Antworten, ein Verfahren / Eigenschaftenaccessor schaffen, die nicht zugeordnet ist, und dass gibt eine Standard / null-Objekt, wenn die tatsächliche Adresse ist null.

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

oder ähnlich dem ersten, 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; }
  }
}

Andere Tipps

Dank James' Ideen (siehe seine Antwort und Kommentare) Ich habe die Eigenschaft Adresse meiner Person Entität geändert von:

public virtual string Address { get; set; }

zu:

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

Das hat mein Problem gelöst, es funktioniert, und es scheint, mit NHibernate zu arbeiten. Yey!

In einigen Fällen ist es sehr einfach, eine NHibernate individuelle Art zu schreiben. Anstatt die Komponente auf null einstellen, würde es das Null-Objekt zurück. Ich habe dies in einigen Fällen, dann können Sie über nulls vergessen.

Beispiel eines zusammengesetzten Benutzertyp .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top