3 Stimmen

C# Enum mit Werten in Sql Server Tabelle

Im Moment habe ich eine SQL Server 2005-Tabelle, die in etwa so aussieht:

ID | name  | desc
----------------------
1  | ONE   | Value One
3  | THREE | Value Three
5  | FIVE  | Value Five

Diese Tabelle entspricht einem Enum in C#, das wie folgt aussieht:

enum MsgTypes{
  <summary>Value One</summary>
  ONE = 1,
  <summary>Value Three</summary>
  THREE = 3,
  <summary>Value Five</summary>
  FIVE = 5
}

Meine Frage ist also folgende: Gibt es eine gute Möglichkeit, das Enum mit der SQL-Tabelle zu verknüpfen, so dass alle Änderungen/Ergänzungen zu den Werten in der Tabelle nicht manuell in den c#-Code gemacht werden müssen?

11voto

Jon Skeet Punkte 1325502

Wenn Sie wollen, dass es einigermaßen dynamisch ist, warum machen Sie es dann zu Beginn zu einer Aufzählung? Holen Sie die Details einfach beim Start der Anwendung aus der Tabelle und speichern Sie sie in (sagen wir) einer Dictionary<int, string> . Sie können den Wert jederzeit in einem eigenen Werttyp kapseln, der den Bereich erzwingt, wenn Sie das möchten.

Wenn es Ihnen nichts ausmacht, das Programm neu zu kompilieren, können Sie es alternativ auch unter bauen Zeit und generiert automatisch den Enum-Quellcode.

3voto

Tim Barrass Punkte 4588

Ich musste kürzlich über etwas Ähnliches nachdenken ( Refaktorierung einer Aufzählung ) -- grundsätzlich habe ich erwogen, ein Dictionary zu verwenden <A, B > zum Speichern der Aufzählungswerte. Wenn Sie möchten, können Sie das Wörterbuch dynamisch aus der Tabelle laden, um es zu füllen.

Eine Sache, die ich hinzufügen würde - ist, wenn Sie eine Aufzählung ersetzen, die bereits mit etwas dynamischen müssen Sie darüber nachdenken, was Sie mit Ausnahmen, die als Teil der dynamisch auffüllen es zu tun sind.

1voto

n8wrl Punkte 19091

Für mich hängt es davon ab, wie oft sich die Enums/DB-Lookup-Tabellen ändern. Wir haben etwa ein halbes Dutzend solcher Enums/Lookups in unserem System, und es macht mir nichts aus, neu zu kompilieren, um eine Emum-Option + DB-Zeile hinzuzufügen, weil:

  1. Das passiert nicht sehr oft - vielleicht zweimal im letzten Jahr, soweit ich mich erinnern kann.
  2. In der Regel ist die neue Option mit einer neuen Geschäftslogik verbunden, so dass ohnehin eine Kodierung erforderlich ist.

0voto

dparker Punkte 1082

Eine andere Alternative wäre die Implementierung eines benutzerdefinierten Objekts mit den Eigenschaften ID, Name und Desc, das die Datenbanktabelle kapseln würde.

0voto

Ich akzeptiere, was Jon vorschlägt, aber dann, wenn Sie es vorziehen, Ihre Enum-Liste in der DB zu haben und sie in Ihrem Code verwenden möchten, könnten Sie verwenden TypTabelle Funktion von nHydrate für Ihr Projekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X