Ricerche statiche in NHibernate
-
06-07-2019 - |
Domanda
Voglio utilizzare alcune delle ricerche predefinite senza roundrip a Database in NHibernate.
Fondamentalmente vorrei avere un codice come questo:
public class Countries
{
static Countries() {
Australia = new Country
{
Id = 14,
Description = "Australia"
}
}
public static Country Austrlia { get; protected set }
}
Quindi scrivi questo snippet di codice:
address.Country = Countries.Australia;// Snippet1
if (address.Country == Countries.Australia) { // Snippet2
// Do something
}
Quindi eseguo l'override di Equals, GetHashCode e persino degli operatori di overload == e! = per la ricerca della classe Country.
Lo Snippet1 funziona SOLO se il Paese con ID specificato non è stato caricato in memoria. Altrimenti genera NonUniqueObjectException dicendo che l'oggetto con ID specificato è già in memoria.
Per ovviare a questo, devo sfrattare il paese caricato e quindi assegnare il valore di ricerca. Questo sembra sbagliato e non sono sicuro di cosa accadrà quando la query per la ricerca Paese verrà eseguita di nuovo.
Quindi la domanda è: come mantenere le classi di ricerca statica in NHibernate?
Grazie, Dmitriy.
Soluzione 2
Sembra che NHibernate non possa gestire 2 oggetti logicamente uguali (ma istanze diverse).
Quindi, invece di mescolare "ricerca statica" con le ricerche nel database è meglio utilizzarne solo una.
Nel mio caso - ricerche memorizzate nel database. MA per evitare il viaggio di andata e ritorno nel database solo per ottenere l'oggetto, è necessario utilizzare Load anziché Get:
address.Country = Session.Load<Country>(CountryIds.Australia); // This does not hit DB
address.Country = Session.Get<Country>(CountryIds.Australia); // This DOES hit DB
Altri suggerimenti
Scopri cosa chiamiamo Classi di enumerazione ..
È fondamentalmente il modello peso mosca .
Puoi persistere, usando un'implementazione IUserType
, come valore o nome visualizzato.
Facciamo cose folli con loro. Ad esempio, fornire tabelle di ricerca con generazione automatica con chiavi esterne per gli utenti DBA mantenendo tutti i valori nel codice.