2010-12-03 42 views
0

J'ai beaucoup de tables dans ma conception de schémas (héritage, ne peut pas être changé) avec le motif:énumérations dans NHibernate de table existante

Widget 
----------- 
WIDGET_ID (int, PK) 
WIDGET_TYPE_ID (int, FK) 

WidgetType 
----------- 
WIDGET_TYPE_ID (int, PK) 
WIDGET_TYPE_NAME (varchar) 

exemple des enregistrements de Widget:

WIDGET_ID | WIDGET_TYPE_ID (FK) 
1   3 
2   4 

exemple enregistrements WidgetType:

WIDGET_TYPE_ID | WIDGET_TYPE_NAME 
3    "Foo" 
4    "Bar" 

Fondamentalement, de nombreuses tables de ma DB ont des tables "Type" correspondantes qui leur sont associées. ULD comme construire comme énumérations dans le modèle d'objet, à savoir:

Widget newWidget = new Widget(); 
newWidget.WidgetType = WidgetType.Foo; 

Est-il possible de le faire avec NHibernate, si oui à quoi ressemblerait la cartographie comme? Si non, quelle est la meilleure approximation? La seule façon que je pouvais penser était de construire un (non persisté) type d'énumération dans le code qui correspond à l'ID de type:

enum WidgetType { Foo=3, Bar=4 }; 

Mais je préfère ne pas avoir à maintenir ce ENUM que les choses sont ajoutées/retirée le DB ...

Répondre

1

Les énumérations C# sont juste une commodité de conception qui existent pour rendre le code plus facile à lire et à écrire. Ils compilent simplement des entiers (ou quel que soit le type primitif approprié). Pour que NHibernate (ou tout autre ORM) les gère, vous devez l'intégrer dans l'EDI et Visual Studio doit interagir avec lui pendant que vous modifiez votre code. Cela pourrait être utile, mais je suppose que vous devriez avoir beaucoup d'enums qui changent assez fréquemment pour que ça en vaille vraiment la peine. À mon avis, il n'y a pas de complément comme celui de NHibernate, mais vous pouvez utiliser un générateur de code pour synchroniser vos énumérations avec vos tables de base de données (par exemple, le Text Template Transformation Toolkit - aka "T4 Templates" - qui vient avec Visual Studio).

+0

Alors suggérez-vous que j'écris une requête SQL pour obtenir les WIDGET_TYPE_IDs et WIDGET_TYPE_NAMEs puis utilisez T4 pour générer du code pour les énumérations? Cela semble trop compliqué ... Je dirais que NHibernate est conçu pour faire la correspondance entre les enregistrements DB et les objets - étant un ORM et tout. S'ils n'ont pas de support Enum, je préfère les modéliser comme des classes standard (et être légèrement déçu par le manque de support d'Enum par NHibernate ...) – JeffRousseau

+0

@Jeff - exactement. J'ai peut-être mal compris votre problème: vous avez absolument raison de dire que les classes standard fonctionnent bien. Pourquoi voulez-vous utiliser les énumérations au lieu des classes standard en premier lieu? –

+0

Enums sont un mappage plus proche de la façon dont je traiterais les tables "Type" dans object-land. Si je les ai mappés en classes, je devrais faire quelque chose comme ceci: WidgetType FooType = new WigetType; FooType.Type = "Foo"; Widget widget = nouveau widget; widget.WigetType = FooType; (Je devrais aussi m'assurer que créer de nouvelles instances de classes "Type" n'introduisent pas de nouveaux enregistrements, mais plutôt référence les éléments existants par leur valeur de chaîne) fondamentalement c'est plus d'une douleur ... – JeffRousseau