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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top