2009-07-31 9 views
1

Je souhaite utiliser certaines des recherches prédéfinies sans roundrips dans Database dans NHibernate.Recherches statiques dans NHibernate

En fait, je voudrais avoir le code comme ceci:

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

écrire alors ce extraits de code:

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

Je ne surchargent equals, GetHashCode et de surcharge, même les opérateurs == et = pour la recherche de classe de pays. Le Snippet1 fonctionne UNIQUEMENT si le pays avec Id donné n'a pas été chargé en mémoire. Sinon, il lève NonUniqueObjectException en disant que l'objet avec Id donné est déjà en mémoire. Pour contourner ce problème, je dois expulser le pays chargé, puis affecter la valeur de recherche. Cela semble incorrect et je ne suis pas sûr de ce qui se passera lorsque la requête pour la recherche de pays sera à nouveau exécutée. Donc, la question est: Comment maintenir les classes de recherche statique dans NHibernate?

Merci, Dmitriy.

Répondre

1

Il semble que NHibernate ne peut pas gérer 2 objets de la même manière (mais avec des instances différentes).
Ainsi, au lieu de mélanger «recherche statique» avec les recherches de base de données, il est préférable de n'utiliser que l'une d'entre elles.

Dans mon cas - les recherches stockées dans la base de données. MAIS pour éviter l'aller-retour dans la base de données juste pour obtenir l'objet, il suffit d'utiliser Load au lieu de 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

Découvrez ce que nous appelons Enumeration classes ..

Il est essentiellement le poids mouche modèle.

Vous pouvez les conserver en utilisant une implémentation IUserType, en tant que valeur ou nom d'affichage.

Nous faisons des trucs fous avec eux. Comme fournir des tables de recherche auto-genned avec des clés étrangères pour les gens DBA tout en gardant toutes les valeurs dans le code.

+0

Merci. Bon. Mais pas exactement ce dont j'ai besoin. Je vais essayer d'être plus précis: 1) adresse.Pays = Pays.Australie QUAND adresse.Pays a déjà été attribué et persisté. Il provoque NonUniqueObjectException. ET 2) address.Country = Session.get (UserSelectedIdFromScreen) QUAND: Liste des pays est peuplé de base de données et pas de code. Seules quelques valeurs prédéfinies sont connues dans le code. D'autres viennent de DB. –