2010-12-03 6 views
0

Ich habe viele Tabellen in meinem Schema-Design (legacy, kann nicht geändert werden) mit dem Muster:Aufzählungen in NHibernate aus vorhandener Tabelle

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

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

Beispiel Widget Datensätze:

WIDGET_ID | WIDGET_TYPE_ID (FK) 
1   3 
2   4 

Beispiel WidgetType Datensätze:

WIDGET_TYPE_ID | WIDGET_TYPE_NAME 
3    "Foo" 
4    "Bar" 

Grundsätzlich haben viele Tabellen in meiner Datenbank entsprechende "Type" -Tabellen, die ich mit ihnen verknüpfe ULD gerne als Aufzählungen im Objektmodell zu konstruieren, das heißt:

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

Gibt es eine Möglichkeit, dies mit NHibernate zu tun, wenn ja, was würde wie die Abbildung aus? Wenn nicht, was ist die beste Annäherung? Die einzige Art, wie ich denken konnte, war einen (nicht bestanden) Aufzählungstyp in Code zu erstellen, die den Typ-IDs übereinstimmt:

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

Aber ich mag lieber nicht diese Enum zu halten habe, wie die Dinge hinzugefügt/entfernt von die DB ...

Antwort

1

C# -Enumerationen sind nur eine Design-Zeit-Bequemlichkeit, die vorhanden sind, um Code einfacher zu lesen und zu schreiben. Sie kompilieren nur zu Ganzzahlen (oder was auch immer der geeignete primitive Typ ist).

Um NHibernate (oder ein anderes ORM) zu verwalten, müssten Sie es in die IDE integrieren, und Visual Studio müsste während der Bearbeitung Ihres Codes mit ihm interagieren.. Das könnte nützlich sein, aber ich vermute, dass du eine Menge Enums haben musst, die sich ziemlich häufig ändern, damit es sich wirklich lohnt.

Es gibt kein Add-In wie das für NHibernate, das ich kenne, aber Sie können einen Code-Generator verwenden, um Ihre Enumerationen mit Ihren Datenbanktabellen synchron zu halten (zum Beispiel die Text Template Transformation Toolkit - aka "T4 Templates") - was mit Visual Studio geliefert wird).

+0

Also schlagen Sie vor, ich schreibe eine SQL-Abfrage, um die WIDGET_TYPE_IDs und WIDGET_TYPE_NAMEs zu erhalten und dann T4 zu verwenden, um Code für die Enums zu generieren? Scheint übermäßig kompliziert ... Ich würde argumentieren, dass NHibernate ist entworfen, um die Zuordnung von DB-Datensätze zu Objekten - ein ORM und alle. Wenn sie keine nette Enum-Unterstützung haben, würde ich sie eher als Standardklassen modellieren (und in NHibernates Mangel an Enum-Unterstützung leicht enttäuscht sein ...) – JeffRousseau

+0

@Jeff - genau. Vielleicht habe ich dein Problem falsch verstanden: Du hast absolut recht, dass Standardklassen gut funktionieren. Warum möchten Sie an erster Stelle Aufzählungen anstelle von Standardklassen verwenden? –

+0

Enums sind eine nähere Zuordnung, wie ich die "Typ" -Tabellen in Objekt-Land behandeln würde. Wenn ich sie als Klassen zuordnen würde, müsste ich so etwas tun: WidgetType FooType = new WiggetType; FooType.Type = "Foo"; Widget Widget = neues Widget; widget.WigetType = FooType; (Ich müsste auch sicherstellen, dass das Erstellen neuer Instanzen von "Typ" -Klassen keine neuen Datensätze einfügen, sondern stattdessen vorhandene Elemente durch ihre Zeichenfolge Wert) im Grunde ist es mehr ein Schmerz ... – JeffRousseau