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 ...
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
@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? –
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