Statische Lookups in NHibernate
-
06-07-2019 - |
Frage
Ich möchte einige vordefinierte Abfragen ohne roundrips zur Datenbank in NHibernate verwenden.
Im Grunde 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 dieser Code-Schnipsel schreiben:
address.Country = Countries.Australia;// Snippet1
if (address.Country == Countries.Australia) { // Snippet2
// Do something
}
Also ich überschreiben Equals, GetHashCode und sogar Überlastung Operatoren == und! = Für Country Klasse Lookup.
Die Snippet1 funktioniert nur, wenn das Land mit gegebener Id wurde in dem Speicher nicht geladen. Ansonsten wirft es NonUniqueObjectException das Objekt mit gegebenen Id sagen will, ist bereits im Speicher.
Um workaraound das ich das geladene Land zu vertreiben und dann den Nachschlag-Wert zuweisen. Das fühlt sich falsch und ich bin mir nicht sicher, was passieren wird, wenn die Abfrage für Land-Lookup wieder ausgeführt wird.
Die Frage ist also: Wie statische Lookup-Klassen in NHibernate halten
Danke, Dmitriy.
Lösung 2
Es scheint, NHibernate kann nicht zwei Objekte verarbeiten logisch die gleichen (aber verschiedene Instanzen).
Also statt „statische Lookup“ mit Datenbank-Lookups Mischen ist es besser, nur einen von ihnen zu verwenden.
In meinem Fall - Lookups in der Datenbank gespeichert. Aber um Folgendes zu bieten, um die Datenbank zu vermeiden, nur um zu erhalten, das Objekt nur Last benötigt wird, statt Get zu verwenden:
address.Country = Session.Load<Country>(CountryIds.Australia); // This does not hit DB
address.Country = Session.Get<Country>(CountryIds.Australia); // This DOES hit DB
Andere Tipps
Überprüfen Sie heraus, was wir Enumeration Klassen ..
Es ist im Grunde die Fliegengewicht Muster.
Sie können sie bestehen bleiben, eine IUserType
Implementierung verwendet wird, als Wert oder den Anzeigenamen.
Wir tun verrückte Sachen mit ihnen. Wie bieten Auto-genned Lookup-Tabellen mit Fremdschlüsseln für DBA Leute während alle Werte in Code zu halten.