2009-07-31 13 views
1

Ich möchte einige der vordefinierten Lookups ohne Rundschreiben für Datenbank in NHibernate verwenden.Statische Lookups in NHibernate

Grundsätzlich würde Ich mag Code wie diese haben:

public class Countries 
{ 
    static Countries() { 
    Australia = new Country 
     { 
      Id = 14, 
      Description = "Australia" 
     } 
    } 
    public static Country Austrlia { get; protected set } 
} 

Dann ist diese Code-Schnipsel schreiben:

address.Country = Countries.Australia;// Snippet1 
if (address.Country == Countries.Australia) { // Snippet2 
    // Do something 
} 

So kann ich überschreiben Equals, GetHashCode und sogar Betreiber überlasten == und = für die Länderklassensuche.

Das Snippet1 funktioniert nur, wenn das Land mit der angegebenen ID nicht in den Speicher geladen wurde. Andernfalls wird NonUniqueObjectException ausgelöst, da das Objekt mit der angegebenen ID bereits im Speicher vorhanden ist.

Um dies zu bearbeiten, muss ich das geladene Land entfernen und dann den Lookup-Wert zuweisen. Das fühlt sich falsch an und ich bin mir nicht sicher, was passieren wird, wenn die Abfrage für die Ländersuche erneut ausgeführt wird.

Die Frage ist also: Wie statische Lookup-Klassen in NHibernate beibehalten?

Danke, Dmitriy.

Antwort

1

Es scheint, NHibernate kann nicht 2 Objekte logisch gleich behandeln (aber verschiedene Instanzen).
Also statt "statische Nachschlagen" mit Datenbank-Lookups zu mischen, ist es besser, nur einen von ihnen zu verwenden.

In meinem Fall - Lookups in der Datenbank gespeichert. ABER zur Vermeidung von Roundtrip in die Datenbank, nur um das Objekt zu erhalten, ist es nur notwendig, Load zu verwenden, anstatt Get:

address.Country = Session.Load<Country>(CountryIds.Australia); // This does not hit DB 
address.Country = Session.Get<Country>(CountryIds.Australia); // This DOES hit DB 
2

prüfen, was wir Enumeration classes .. rufen

Es ist im Grunde das Fliegengewicht Muster.

Sie können diese mit einer IUserType Implementierung als Wert oder Anzeigenamen beibehalten.

Wir machen verrückte Sachen mit ihnen. Wie Sie automatisch genannte Nachschlagetabellen mit Fremdschlüsseln für DBA-Benutzer bereitstellen und dabei alle Werte im Code beibehalten.

+0

Danke. Gute Eins. Aber nicht genau das, was ich brauche. Ich werde versuchen, genauer zu sein: 1) address.Country = Countries.Australia WHEN address.Country wurde bereits zugewiesen und beibehalten. Es verursacht NonUniqueObjectException. UND 2) address.Country = Session.Get (UserSelectedIdFromScreen) WANN: Liste der Länder wird aus der Datenbank und nicht aus dem Code aufgefüllt. Im Code sind nur einige vordefinierte Werte bekannt. Andere kommen aus der DB. –

Verwandte Themen