Die Erste Code-Enumerationen in Lookup-Tabellen
Habe ich in viele Läden, wo Sie lief ein Datenbank-Erste, Modell-Lookup-Tabellen wurden immer erforderlich. Ihre lookup-Tabelle entsprechend Ihrer Enums, so dass Sie gehalten Integrität der Datenbank. Ich 100% Stimmen mit dieser Idee, haben aber festgestellt, dass, wenn es um den Code-First-Modell, diese ist nicht verfügbar, out of the box. Ich habe irgendwo gelesen, dass das EF-Team Hinzugefügt werden kann, die Fähigkeit, dynamisch zu haben Enumerationen, die Hinzugefügt, um Ihr DB (über die Völkerwanderung) in EF7 aber Sie gewarnt, dass es nicht ein Versprechen.
So, wie Sie (wenn überhaupt) bewerkstelligen? Ich werde meine Lösung unten in eine Antwort und freue mich auf Ihr feedback.
Ich bin mit EF 6.1.3 und .NET 4.5.1
- Werfen Sie einen Blick auf stackoverflow.com/questions/11167665/...
- Ich wusste, dass Sie geplant, es (irgendwann), aber ich wurde krank warten. Ich habe gelesen durch die Kommentare und sah Ihr NuGet-Paket-Post...Schön. Ich werde es in mein Projekt, danke.
- Ich mag dein Projekt, es ist schön...hat ein Problem mit ein paar Dinge, wie zum Beispiel Benutzerdefinierte Schemas, aber insgesamt ist es schön. Ich gabelte Sie es und sehen, ob ich helfen kann, mit es.
- Vielen Dank, bin froh, dass es dir gefällt. Ich habe ein bisschen mehr hinter auf den Umgang mit Beiträgen, als ich möchte, aber es ist weit von Toten. Würde ich es nennen, mehr "stabil" <grins>
- Sie haben pull-Anfrage, dass möglicherweise einige der gleichen Probleme, die ich lief in. Vor allem benutzerdefiniertes schema Verwendung. Ich würde auch hinzufügen, einige Konfigurations-Optionen zu ermöglichen, für die Umsetzung der enum-Tabellen in ein eigenes schema.
- Ja das ist eine gute Idee. Die pull-requests müssen einige arbeiten, bevor Sie können gehen, es ist ein Projekt, wo ich bekommen, um meine eigenen standards von dem, was geht für einmal 🙂
- Lol ya ich höre Sie auf die Einstellung der eigenen standards.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Also ich werde nicht Lügen, meine Lösung ist ein bisschen in die Tiefe, aber ich verwende es jetzt seit einigen Tagen und ich finde es funktioniert genau so, wie ich es brauche.
Let ' s start an der Spitze, meine base Klasse I erstellt:
Hier ist ein Beispiel einer meiner lookup-Tabelle Entity-Modellen:
Hier ist das Enum, das geht mit dieser Lookup-Tabelle:
Den StringValue Attribut ist ein benutzerdefiniertes Attribut, die ich erstellt (basierend auf den Beispielen, die ich online gefunden), die mir erlauben, zu rufen:
Wird wieder der string-Wert:
Home
.Ich fügen Sie die Lookup-Entity-Modell, um meine DbSets so wird die Tabelle erstellt, aber ich habe nie direkt auf den Lookup Entity-Modelle in meinen anderen Entity-Modellen. Ihr einziger Zweck ist die Erstellung von lookup-Tabellen in der DB, so dass ich kann für Foreign Key-Einschränkungen gegen Sie.
In meinem OnModelCreating Methode für meine Rahmen, die ich habe, um das hinzufügen das, weil die Daten Anmerkung nicht scheinen zu halten den ganzen Weg durch:
In meinem Migration der Konfigurations-Datei, füge ich diese in der Seed-Methode:
Letzten, in der Migration-Datei selbst verschieben ich alle lookup-table creation-Methoden an die Spitze der Liste, jetzt kann ich add Foreign Key-Einschränkungen für eine Tabelle, die Referenzen, enum. In meinem Fall, ich nahm es einen Schritt weiter. Seit der Migration-Klasse ist eine teilweise, erstellte ich eine weitere partielle Klasse zu entsprechen. Zwei Methoden erstellt:
In der LookupDataUp Methode, füge ich alle meine custom Foreign-Keys und Indizes und in der LookupDataDown ich Entferne alle meine custom Foreign-Keys und Indizes.
Wenn ich Update-Datenbank, die alle meine Tabellen, die verwendet werden, um einige integer-Wert repräsentiert etwas (in diesem Fall ein AddressType), hatte aber keinen wirklichen Wert, jetzt haben Sie einen Wert, die gesehen werden kann durch Verknüpfung mit den lookup-Tabelle.
Ich gebe zu, dies scheint wie eine Menge Arbeit, nur um eine kleine Menge von Daten in der Datenbank, aber jetzt jedes mal wenn ich auf entfernen/ändern/hinzufügen von neuen Elementen zu meinen enum, wird es automatisch betätigt wird, um die DB. Plus wie ich bereits in der obigen Frage, dies schafft Integrität der Datenbank durch die foreign key-Einschränkung auf das 'integer' Feld.
Wenn Sie nicht auf der Suche zu matschig Ihrem Kontext, aber immer noch wollen, dass Ihr enums in der Datenbank für die Problembehandlung bei & manuelle Abfragen. Es ist auch nicht ideal, aber Sie können eine at-once-migration, wenn Sie es brauchen. Offensichtlich gibt es einige Aufräumarbeiten und Optimierungen durchgeführt werden, die variieren können, je nach Anwendungsfall.