9

Ich habe eine Person Unternehmen eine Adresse als Wertobjekt enthält:Nullwert Objekte in 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); 
    }); 
} 

Darin heißt es in der NHibernate docs, dass, wenn alle Eigenschaften eines Wertobjekt (Address1, Address2 usw.) sind Null, die gesamte Komponente wird als Null zugeordnet (dh Person.Address ist null). Dies ist mir Probleme in den Fällen geben, in der alle Adressfelder, weil in meinen Seiten null sind, wo ich haben könnte (ich tue ASP MVC):

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

Dieser mit einer Null-Referenz Ausnahme bricht. Daher suche ich nach einer sauberen Methode, um Address als neues Address() -Objekt zu setzen, und nicht als null, wenn alle Felder leer sind, wenn ich eine Person aus der Datenbank lade, ohne sie manuell auszuführen. Ich habe folgende Ideen diskon:

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

machen Datenbankfelder nicht-nullable (I mit einer Legacy-Datenbank zu tun haben)

jemand irgendwelche Ideen ?

Antwort

2

Ich habe keine definitive Antworten zum Erstellen einer Methode/Eigenschaft Accessor, 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 dem ersten, einen Wrapper für Ihre Address erstellen, die Sie in der Ansicht verwenden.

public virtual string Address { get; set; } 

zu:

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

Wird ziemlich hässlich, sobald Sie tatsächlich Adresse in der Benutzeroberfläche bearbeiten müssen, nicht nur zeigen, nicht wahr? – alex

+0

Ja, hat einen besseren Vorschlag? –

+0

Tolle Ideen, danke! Ändern des tatsächlich zugeordneten Adresseigenschaftszugriffsadressors, um das Abrufen und Festlegen wie gewohnt zu ermöglichen, aber mit dem Nullabgleich in der Get-Adresse neue Adresse(); funktioniert. Ich kann jetzt Adressen laden und bearbeiten, selbst wenn sie null sind, ohne meine Ansicht zu ändern, und der Ruhezustand wird nicht durcheinander gebracht. –

5

Dank James' Ideen (seine Antwort und Kommentare sehen) Ich habe die Eigenschaft Adresse meiner Person Entität aus modifizierten

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

Diese gelöst Mein Problem, es funktioniert, und es scheint mit NHibernate zu arbeiten. Ja!

0

In einigen Fällen ist es sehr einfach, einen benutzerdefinierten NHibernate-Typ zu schreiben. Anstatt die Komponente auf null zu setzen, würde sie das Null-Objekt zurückgeben. Ich habe das in einigen Fällen getan, dann kann man Nullen vergessen.

Example of a composite user type.