Frage

Ich habe ein Datenobjekt (lassen Sie uns sagen, dass es ‚Entry‘ genannt), die eine Reihe von möglichen Zuständen hat, die etwa wie folgt aussehen:

1 - Created
2 - File added
3 - Approved
4 - Invalid

Dies wird in der Datenbank mit einer ‚Status‘ Tabelle mit einem Autowert Primärschlüssel repräsentiert, dann ein ‚StatusID‘ Feld in der Haupttabelle, mit den entsprechenden Beziehungen einzurichten.

In meiner (benutzerdefinierte) Datenschicht, habe ich das Objekt ‚Entry‘, und, zur Zeit habe ich auch eine Enum mit den Staaten erkläre oben angegebenen aufgeführt. Schließlich erkläre ich eine private Instanz dieser Enum zusammen mit dem entsprechenden öffentlichen Eigentum.

In meiner ‚Commit ()‘ Methode warf ich die Instanz des Enum auf eine ganze Zahl und gibt sie an eine Update-gespeicherten Prozedur.

In meinem statischen ‚GetEntry ()‘ Methode, die ich offensichtlich eine ganze Zahl bestanden haben, aus der Datenbank zurück. Ich verwende dann die ‚Enum.Parse ()‘ Verfahren, ein Objekt zu extrahieren, die ein Beispiel für meine Enum ist, der mit der zurückgegebenen Status Ganzzahl entspricht. Ich warf diese auf die Art meiner Enum und weisen sie auf den lokalen privaten Variablen.

Meine Frage ist ziemlich einfach - ist dieser Ansatz angemessen, und wenn nicht, was alternative, andere als nur den rohen Integer-Wert zu speichern (was ich nicht unbedingt abgeneigt bin), ist besser

.

Mein Grund für die Nachfrage ist, dass dies alles nur für mich unglaublich chaotisch scheint, was mit all dem Gießen und zwei Listen mit dem gleichen Satz von Werten zu halten. Ich akzeptiere der Nutzen liegt in einer besseren Erfahrung für den Verbraucher des Datenobjekts, aber auch so ...

Danke!

War es hilfreich?

Lösung

Wir haben etwas Bekanntes in einem unserer Projekte. Wir haben eine Tabelle Arten von Gegenständen containting. Diese Typen haben eine ID, in dem Code, den wir haben eine Enumeration mit dem gleichen IDs. Die Sache ist, in der Datenbank verwenden wir Autowert nicht (Identität), so haben wir die volle Kontrolle über die ID. Und wenn unser Ziel Speichern wir nehmen nur die ID des Enum das Objekt zu speichern. Ich dachte auch dieser Ansatz war chaotisch, aber es ist nicht so schlimm afterall.

Andere Tipps

Diese Methode scheint gut zu mir.

In der Vergangenheit habe ich das gleiche getan hatte aber auch eine Tabelle, die eine Zeile für jedes Mitglied der Enumeration enthalten, der Tisch war dann der Fremdschlüssel für jede Tabelle, die den ENUM-Wert verwendet wird, nur so jemand die Datenbank lesen war jeder Status konnte verstehen, was ohne die eigentliche enum zu sehen ist.

zum Beispiel, wenn ich habe eine Enumeration wie

enum status
{
    Active,
    Deleted,
    Inactive
}

würde ich eine Tabelle namens Status haben, die folgenden Datensätze haben würde

ID Name
0 Active
1 Gelöschte
2 Inaktiv

würde, die Tabelle dann der Fremdschlüssel für Tabellen, die diese Enumeration verwendet wird.

Yup das ist in Ordnung!

Bitte immer explizit die Werte wie folgt festgelegt. Auf diese Weise, wenn jemand jemals etwas hinzufügen geht werden sie die Werte erkennen, sind wichtig und sollten nicht mit verwirrt werden.

enum status
{
    Active = 1,
    Deleted = 2,
    Inactive = 3
}

Wenn Sie den Wert um über WCF vorbei sind würde ich empfehlen, das Hinzufügen

  NULL = 0

Andernfalls, wenn Sie versuchen, eine 0 kommt aus der Datenbank serialisieren Sie einen schrecklichen Fehler bekommen und es wird Sie für immer zu debuggen nehmen.

die Datenbank-Lookup-Tabelle ist notwendig; die programmatische Enum ist praktisch ‚magische Zahlen‘, die im Code zu vermeiden

, wenn Ihr Code muss nicht um den Status zu manipulieren, aber dann die ENUM ist nicht erforderlich

ich diesen Ansatz mit Aufzählungen die ganze Zeit. Wenn es sich um ein einfaches Element wie Status, der nicht erwartet wird, jemals zu ändern ziehe ich den Enum. Die Analyse und Gießen ist ein sehr geringe Auswirkungen Betrieb.

Ich habe mit Linq dies erfolgreich tun jetzt ohne Probleme für einige Zeit auf SQL. Linq wird von Enum tatsächlich konvertiert automatisch in int und zurück.

-Code ist mehr als nur um Geschwindigkeit, sondern die Lesbarkeit. Aufzählungen machen Code lesbar.

Zur Beantwortung Ihrer Frage direkt dies ein sehr gültiger apporach ist.

Wenn Ihr Code erfordert bekannt „Status“ Wert einstellen (die Sie in Ihrer Enum definiert haben), dann ist es wahrscheinlich auch eine Anforderung, dass diese „Status“ Werte in der Datenbank vorhanden sein. Da müssen sie existieren sollten Sie auch die Kontrolle über die status_id zu jedem dieser Werte zugewiesen haben.

die Identität Sturz- und nur explizit das Lookup-Wert-IDs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top