Gibt es eine gute Möglichkeit, die Code-First-Migrationen zu erweitern?

9

Ich beginne ein neues Projekt, das Entity Framework verwendet. Ich habe meine Optionen zum Erstellen der Datenbank untersucht und herausgefunden, dass Code-First-Migrationen am sinnvollsten sind (siehe unten, wenn Sie wissen wollen, warum). Durch Code-First-Migrationen kann ich auf beliebiges SQL zurückgreifen, was bedeutet, dass ich immer noch die volle Kontrolle habe. In der Praxis habe ich festgestellt, dass das Herunterfallen auf SQL für einige der üblichen Aufgaben schrecklich repetitiv ist.

Für meine Zwecke interessiert es mich nicht, dass Erweiterungen in der Migration providerunabhängig sind (die SQL, die ich einfüge, nicht). Im Migrations-Framework finde ich jedoch keine gute Nahtstelle oder Erweiterung, um solche Dinge hinzuzufügen.

Angenommen, ich möchte eine RowGuid-Spalte für die MS-SQL-Replikation angeben. Jedes Vorkommen hat die Form von

%Vor%

Also schreibe ich statische Methoden, um etwas von der Redundanz loszuwerden

%Vor%

-oder -

%Vor%

Möglicherweise könnte eine dieser Erweiterungsmethoden auf DbMigration angewendet werden und auf sie durch this. zugreifen. Aber das sieht immer noch fehl am Platz aus:

%Vor%

Es ist nicht schrecklich, aber es fühlt sich immer noch wie ein Hack für mich an. Ich muss den Tabellennamen wiederholen, und ich muss sicherstellen, dass ich den generierten Spaltennamen richtig erkläre. Ich finde den Tabellennamen muss viel wiederholt werden, aber auch Spalten. Aber was ich wirklich versuche, zu tun, wenn ich auf die Tabellendeklaration setze, die gerade passiert ist, wo sowohl der Tabellenname als auch die Spaltennamen bekannt waren.

Ich konnte jedoch keinen guten Erweiterungspunkt finden, um die fließende Schnittstelle zu erweitern oder den Code für die ersten Migrationen auf eine Weise zu erweitern, die sich konsistent anfühlt. Fehle ich etwas? Hat jemand einen guten Weg gefunden, dies zu tun?

Einige Gründe, warum ich in dieser Situation bin:

Ich mochte die aus einer Reihe von Gründen scheinbar nicht übliche Lösung für die Verwendung allgemeiner Common-Attribute-Lösungen, um auf Nicht-Mapping-Datenbanken hinzuweisen, aber am stärksten, weil sie nicht automatisch von Migrationen übernommen werden, was zusätzliche Wartung bedeutet. Modell-erste Lösungen waren out, weil sie nicht die volle Kontrolle über die Datenbank geben. Database-First war wegen der Kontrolle ansprechend; Es verfügt jedoch nicht über die Standardfunktion für die Änderungsverwaltung, die von Code-First Migrations bereitgestellt wird. Daher schienen Code-First Migrations ein Gewinner zu sein, da [code-first] modellgesteuerte Änderungen automatisch sind und es bedeutete, dass es nur eine Sache zu pflegen gab.

    
vossad01 14.09.2012, 04:30
quelle

2 Antworten

5

Ich habe eine Lösung gefunden, obwohl ich nicht sicher bin, ob es gut ist. Ich musste ein wenig tiefer in das Kaninchenloch gehen, als ich es wollte, und es ist nicht wirklich ein Verlängerungspunkt.

Es erlaubt mir, Aussagen wie:

zu schreiben %Vor%

Ich mag nicht:

  • Die Tatsache, dass ich über private Mitglieder nachdenke und normalerweise keine solche Lösung verwenden würde
  • Das Lambda zur Auswahl einer Spalte könnte den falschen Spaltennamen zurückgeben, wenn der optionale Parameter "name" der Spaltendefinition verwendet wurde.

Ich denke nur darüber nach, es hier zu verwenden, weil:

  • Wir versenden die EF-Baugruppe, so dass wir sicher sind, dass die verwendete Baugruppe diese Elemente enthält.
  • Ein paar Unit-Tests sagen uns, ob eine neue Version diese bricht.
  • Es ist für Migrationen isoliert.
  • Wir haben alle Informationen, über die wir nachdenken, und wenn eine neue Version dies bricht, könnten wir einen Hack einsetzen, um diese Funktionalität zu ersetzen.
%Vor%     
vossad01 14.09.2012, 13:23
quelle
0

Keine generische Lösung, aber Sie können von einer abstrakten / Interface-Klasse erben. Dazu müssten einige Code-Änderungen, aber es ist einigermaßen sauber.

Ich habe dieses Muster verwendet, um meine Audit-Spalten (UpdatedBy, UpdateDate usw.) für alle Tabellen zu definieren.

    
ravi 14.09.2012 06:25
quelle