656 Stimmen

Code-first vs. Model/Database-first

Was sind die Vor- und Nachteile der Verwendung von Entity Framework 4.1 Code-first gegenüber Model/Database-first mit EDMX-Diagramm?

Ich versuche, alle Ansätze zum Aufbau einer Datenzugriffsschicht mit EF 4.1 vollständig zu verstehen. Ich verwende das Repository-Muster und IoC .

Ich weiß, dass ich den Code-First-Ansatz verwenden kann: Definieren Sie meine Entitäten und den Kontext von Hand und verwenden Sie ModelBuilder zur Feinabstimmung des Schemas.

Ich kann auch eine EDMX Diagramm und wählen Sie einen Codegenerierungsschritt, der T4-Vorlagen verwendet, um dieselbe POCO Klassen.

In beiden Fällen lande ich bei POCO Objekt, die ORM agnostisch und Kontext, der sich aus DbContext .

Database-first scheint mir am attraktivsten zu sein, da ich die Datenbank in Enterprise Manager entwerfen, das Modell schnell synchronisieren und mit dem Designer fein abstimmen kann.

Worin besteht nun der Unterschied zwischen diesen beiden Ansätzen? Geht es nur um die Präferenz VS2010 vs. Enterprise Manager?

12 Stimmen

Mit Entity Framework 7 wird EDMX abgeschafft: msdn.microsoft.com/de-us/magazine/dn890367.aspx

6 Stimmen

@CADbloke Entity Framework 7 ist jetzt Entity Framework Core 1.0

6 Stimmen

Zu allen anderen Browsern, es sei denn, Sie haben eine Vorliebe für 7000 lange XML-Dateien und das Lösen von Merge-Konflikten in den vorgenannten, zuerst den Code eingeben und ersparen Sie sich Kopfschmerzen

749voto

Ladislav Mrnka Punkte 355028

Ich denke, das sind die Unterschiede:

Erster Code

  • Sehr beliebt, weil Hardcore-Programmierer keine Designer mögen und die Definition des Mappings in EDMX xml zu komplex ist.
  • Volle Kontrolle über den Code (kein automatisch generierter Code, der schwer zu ändern ist).
  • Im Allgemeinen wird erwartet, dass Sie sich nicht um die DB kümmern. DB ist nur ein Speicher mit keiner Logik. EF kümmert sich um die Erstellung, und Sie wollen nicht wissen, wie es die Arbeit erledigt.
  • Manuelle Änderungen an der Datenbank gehen höchstwahrscheinlich verloren, da Ihr Code die Datenbank definiert.

Datenbank zuerst

  • Sehr beliebt, wenn Sie eine DB haben, die von DBAs entworfen oder separat entwickelt wurde, oder wenn Sie eine bestehende DB haben.
  • Sie lassen EF Entitäten für Sie erstellen und nach Änderung des Mappings werden Sie POCO-Entitäten generieren.
  • Wenn Sie zusätzliche Funktionen in POCO-Entitäten wünschen, müssen Sie entweder die T4-Vorlage ändern oder partielle Klassen verwenden.
  • Manuelle Änderungen an der Datenbank sind möglich, da die Datenbank Ihr Domänenmodell definiert. Sie können das Modell jederzeit von der Datenbank aus aktualisieren (diese Funktion funktioniert recht gut).
  • Ich verwende es oft zusammen mit VS Database Projekten (nur Premium und Ultimate Version).

Erstes Modell

  • IMHO beliebt, wenn Sie ein Designer-Fan sind (= Sie schreiben nicht gerne Code oder SQL).
  • Sie "zeichnen" Ihr Modell und lassen Workflow Ihr Datenbankskript und die T4-Vorlage Ihre POCO-Entitäten generieren. Sie werden einen Teil der Kontrolle über Ihre Entitäten und Ihre Datenbank verlieren, aber für kleine, einfache Projekte werden Sie sehr produktiv sein.
  • Wenn Sie zusätzliche Funktionen in POCO-Entitäten wünschen, müssen Sie entweder die T4-Vorlage ändern oder partielle Klassen verwenden.
  • Manuelle Änderungen an der Datenbank gehen höchstwahrscheinlich verloren, da Ihr Modell die Datenbank definiert. Dies funktioniert besser, wenn Sie das Datenbankgenerierungs-Powerpack installiert haben. Damit können Sie das Datenbankschema aktualisieren (anstatt es neu zu erstellen) oder Datenbankprojekte in VS aktualisieren.

Ich gehe davon aus, dass es im Falle von EF 4.1 mehrere andere Funktionen im Zusammenhang mit Code First vs. Model/Database first gibt. Die in Code first verwendete Fluent API bietet nicht alle Funktionen von EDMX. Ich erwarte, dass Funktionen wie Stored Procedures Mapping, Query Views, Defining Views usw. funktionieren, wenn Model/Database first verwendet wird und DbContext (Ich habe es noch nicht ausprobiert), aber sie tun es nicht in Code first.

5 Stimmen

@Ladislav - vielen Dank für die ausführliche Antwort. Nur um das klarzustellen: abgesehen von einigen Einschränkungen der fluent API gibt es keine echten technisch Unterschiede zwischen diesen Ansätzen? Geht es mehr um den Entwicklungs-/Einsatzprozess/die Methodik? Ich habe zum Beispiel getrennte Umgebungen für Dev/Test/Beta/Prod, und ich aktualisiere die Datenbank manuell auf Beta/Prod, da Änderungen am Schema einige komplexe Datenänderungen erfordern könnten. Bei Dev/Test bin ich froh, wenn EF Datenbanken ablegen und erstellen kann, da ich sie in den Initialisierern selbst mit Testdaten bestücken werde.

3 Stimmen

@Jakub: Es gibt keine Unterschiede. Es sind nur verschiedene Ansätze, um mit demselben EF-Kern zu arbeiten. Es ist wie bei der Konfiguration von IoC in der Konfiguration, durch Attribute oder mit fluent API - immer noch das gleiche Ergebnis, aber unterschiedliche Ansätze und einige Einschränkungen in jedem verwendeten Ansatz. Prüfen Sie diese Frage: stackoverflow.com/questions/5433318/ Es gibt einige gute Ideen, wie man das Problem mit verschiedenen Umgebungen lösen kann.

0 Stimmen

@Ladislav - Danke! Ich habe bereits das Problem mit verschiedenen Umgebungen gelöst, indem ich verschiedene Initialisierer basierend auf der Konfiguration bereitstelle, die ich in MSBuild transformiere. Ich bin gerade dabei, das UnitOfWork-Muster zu implementieren, und hoffentlich sollte alles gut funktionieren. PS. Obwohl code-first 'cooler' ist, habe ich mich für database-first entschieden, da ich mehr Kontrolle über die DB haben möchte und die Modellgenerierung mir das Schreiben von Code erspart. PPS. Ich habe auch angefangen, über das Erstellen von Entity-Framework-Ladislav-Tag nachzudenken ;-)

144voto

Bahador Izadpanah Punkte 1836

Ich denke, dass dieser einfache "Entscheidungsbaum" von Julie Lerman, der Autorin von "Programming Entity Framework", helfen sollte, die Entscheidung mit mehr Vertrauen zu treffen:

a decision tree to help choosing different approaches with EF

Mehr Infos Hier .

123 Stimmen

Dies ist nicht vollständig. Was ist, wenn Sie es vorziehen, keinen visuellen Designer zu verwenden, aber eine bestehende Datenbank haben?

19 Stimmen

Schlimmer noch... Entscheidungen im wirklichen Leben werden nicht durch Diagramme getroffen, sondern durch technische Beschränkungen, denen man sich bei der Verwendung von Code-first gegenübersieht, z.B. kann man keinen eindeutigen Index für ein Feld erstellen oder man kann keine hierarchischen Daten in einer Baumtabelle löschen, wofür man eine CTE unter Verwendung von context.Table.SqlQuery("select...") benötigt. Model/Database haben diese Nachteile zunächst nicht.

33 Stimmen

@davenewza das ist der erste Weg, oder?

54voto

Stepan Smagin Punkte 561

Zwischen "Database first" und "Model first" gibt es keine wirklichen Unterschiede. Der generierte Code ist derselbe und Sie können diese Ansätze kombinieren. Zum Beispiel können Sie eine Datenbank mit dem Designer erstellen, dann können Sie die Datenbank mit einem SQL-Skript ändern und Ihr Modell aktualisieren.

Wenn Sie zuerst Code verwenden, können Sie das Modell nicht ändern, ohne die Datenbank neu zu erstellen und alle Daten zu verlieren. IMHO, diese Einschränkung ist sehr streng und erlaubt es nicht, Code zuerst in der Produktion zu verwenden. Für jetzt ist es nicht wirklich brauchbar.

Der zweite kleine Nachteil von Code first besteht darin, dass der Model Builder Berechtigungen für die Master-Datenbank benötigt. Dies betrifft Sie nicht, wenn Sie SQL Server Compact-Datenbank verwenden oder wenn Sie Datenbank-Server steuern.

Der Vorteil von Code First ist ein sehr sauberer und einfacher Code. Sie haben die volle Kontrolle über diesen Code und können ihn leicht ändern und als Ihr Ansichtsmodell verwenden.

Ich empfehle die Verwendung des Code-First-Ansatzes, wenn Sie eine einfache Standalone-Anwendung ohne Versionierung und mit Modell erstellen \database zuerst bei Projekten, die Änderungen in der Produktion erfordern.

7 Stimmen

Wenn Sie die Produktionsumgebung manuell mit SQL-Skripten aktualisieren wollen, können Sie dies auch mit Code First tun. Sie generieren einfach die Änderungsskripte nach Bedarf. Mehrere Tools können diese Deltas automatisieren, und Sie können weiterhin Code First verwenden. Sie müssen lediglich den Code-First-Initialisierer in etwas wie CreateDatabaseIfNotExists ändern, um die aktuelle Datenbank nicht zu löschen.

0 Stimmen

Einige Unterschiede sind der Import von Ansichten und die anschließende Neugenerierung der Datenbank, wobei die Ansichten zu Tabellen werden. Das macht es schwer, eine neue DB zu erstellen und mit der Prod-DB zu vergleichen, um zu sehen, ob sie synchron ist.

0 Stimmen

Model First unterstützt keine benutzerdefinierten SQL-Funktionen (zumindest in EF4, ich weiß nicht, ob sich das geändert hat). Mit Database First können Sie UDFs importieren und sie in Ihren LINQ-Abfragen verwenden.

38voto

Roohi Punkte 7496

Ich zitiere die relevanten Teile aus http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework

3 Gründe für die Verwendung von Code First Design mit Entity Framework

1) Weniger Ballast, weniger Blähungen

Verwendung einer bestehenden Datenbank zur Erstellung einer .edmx-Modelldatei und der Die Verwendung einer bestehenden Datenbank zur Generierung einer .edmx-Modelldatei und der zugehörigen Code-Modelle führt zu einem riesigen Haufen automatisch generierten Codes. Sie werden angefleht, diese generierten Dateien niemals anzurühren, damit Sie nicht etwas kaputt zu machen, oder Ihre Änderungen werden bei der nächsten Generation überschrieben. Der Kontext und der Initialisierer sind in diesem Durcheinander auch noch zusammengeklemmt. Wenn Sie Ihren generierten Modellen Funktionalität hinzufügen müssen, wie eine berechnete schreibgeschützte Eigenschaft, müssen Sie die Modellklasse erweitern. Dies ist am Ende eine Anforderung für fast jedes Modell und man hat am Ende mit einer Erweiterung für alles.

Mit Code first werden Ihre handcodierten Modelle zu Ihrer Datenbank. Die genauen Dateien, die Sie erstellen, erzeugen das Datenbankdesign. Es gibt keine zusätzlichen Dateien und es ist nicht notwendig, eine Klassen Erweiterung zu erstellen, wenn Sie Eigenschaften oder andere Dinge hinzufügen wollen, die die die die Datenbank nicht kennen muss. Sie können sie einfach in dieselbe derselben Klasse hinzufügen, solange Sie die korrekte Syntax einhalten. Sie können sogar eine Model.edmx-Datei erzeugen, um Ihren Code zu visualisieren, wenn Sie wollen.

2) Größere Kontrolle

Wenn Sie zuerst die DB verwenden, sind Sie der Gnade dessen ausgeliefert, was für Ihre Modelle für die Verwendung in Ihrer Anwendung. Gelegentlich ist die Namensgebung Konvention unerwünscht. Manchmal sind die Beziehungen und Assoziationen nicht ganz das, was Sie wollen. Andere Male sind nicht transiente Beziehungen mit trägem Laden Ihre API-Antworten in Mitleidenschaft ziehen.

Zwar gibt es fast immer eine Lösung für Probleme bei der Modellerstellung gibt es zwar fast immer eine Lösung für Probleme bei der Modellerstellung, aber wenn Sie zuerst den Code Kontrolle von Anfang an. Sie können jeden Aspekt sowohl von Ihrer Code-Modelle und Ihres Datenbankdesigns von Ihrem Geschäftsobjekts. Sie können Beziehungen, Einschränkungen und Assoziationen genau festlegen, und Assoziationen. Sie können gleichzeitig Grenzen für Eigenschaftszeichen und Datenbankspaltengrößen festlegen. Sie können angeben, welche verwandten Sammlungen eager geladen oder überhaupt nicht serialisiert werden sollen. Kurz gesagt, Sie sind verantwortlich für mehr Dinge, aber Sie haben die volle Kontrolle über Ihre Anwendung Entwurf.

3) Datenbank-Versionskontrolle

Das ist eine große Sache. Die Versionierung von Datenbanken ist schwierig, aber mit Code first und "Code first"-Migrationen ist es viel effektiver. Da Ihr Datenbankschema vollständig auf Ihren Code-Modellen basiert, tragen Sie durch die Versionskontrolle Versionskontrolle Ihres Quellcodes helfen Sie bei der Versionierung Ihrer Datenbank. Sie sind verantwortlich für die Kontrolle der Kontextinitialisierung, die Sie können z. B. feste Geschäftsdaten einfügen. Sie sind auch für die Erstellung von Code-First-Migrationen verantwortlich.

Wenn Sie Migrationen zum ersten Mal aktivieren, werden eine Konfigurationsklasse und eine erste Migration erzeugt. Die anfängliche Migration ist Ihr aktuelles Schema oder Ihr Basisschema v1.0. Von diesem Zeitpunkt an werden Sie Migrationen hinzufügen die mit einem Zeitstempel versehen und mit einem Deskriptor versehen werden, um die Ordnung der Versionen zu helfen. Wenn Sie add-migration über den Paketmanager aufrufen Manager aufrufen, wird eine neue Migrationsdatei erzeugt, die alles enthält die sich in Ihrem Codemodell geändert haben, automatisch in einer UP() und DOWN()-Funktion. Die UP-Funktion wendet die Änderungen auf die Datenbank an, die DOWN-Funktion entfernt dieselben Änderungen für den Fall, dass Sie einen Rollback. Darüber hinaus können Sie diese Migrationsdateien bearbeiten und Folgendes hinzufügen zusätzliche Änderungen wie neue Ansichten, Indizes, gespeicherte Prozeduren und was auch immer sonst. Sie werden so zu einem echten Versionierungssystem für Ihr Datenbankschema.

31voto

Kind Contributor Punkte 16008

Code-first scheint der aufsteigende Stern zu sein. Ich habe einen kurzen Blick auf Ruby on Rails geworfen, und ihr Standard ist Code-first, mit Datenbankmigrationen.

Wenn Sie eine MVC3-Anwendung erstellen, hat Code first meiner Meinung nach die folgenden Vorteile:

  • Einfaches Attribut Dekoration - Sie können Felder mit Attributen wie Validierung, Erfordernis usw. ausstatten, was bei der EF-Modellierung ziemlich umständlich ist.
  • Keine seltsamen Modellierungsfehler - Bei der EF-Modellierung treten oft seltsame Fehler auf, z. B. wenn man versucht, eine Assoziationseigenschaft umzubenennen, muss sie mit den zugrunde liegenden Metadaten übereinstimmen - sehr unflexibel.
  • Nicht umständlich zu fusionieren - Bei der Verwendung von Code-Versionskontrollwerkzeugen wie Mercurial ist das Zusammenführen von .edmx-Dateien ein Problem. Sie sind ein Programmierer, der an C# gewöhnt ist, und Sie müssen eine .edmx-Datei zusammenführen. Nicht so bei Code-First.
  • Im Gegensatz zum ersten Code haben Sie die vollständige Kontrolle, ohne sich mit all den versteckten Komplexitäten und Unbekannten auseinandersetzen zu müssen.
  • Ich empfehle Ihnen, das Befehlszeilentool des Paketmanagers zu verwenden und nicht einmal die grafischen Tools zu benutzen, um einen neuen Controller zu den Gerüstansichten hinzuzufügen.
  • DB-Migrationen - Dann können Sie auch Migrationen aktivieren. Das ist sehr mächtig. Sie nehmen Änderungen an Ihrem Modell im Code vor, und das Framework kann dann die Schemaänderungen verfolgen, so dass Sie nahtlos Upgrades bereitstellen können, wobei die Schemaversionen automatisch aktualisiert (und bei Bedarf heruntergestuft) werden. (Ich bin mir nicht sicher, aber das funktioniert wahrscheinlich auch mit Model-First)

更新情報

In der Frage wird auch nach einem Vergleich zwischen Code-first und EDMX model/db-first gefragt. Code-first kann auch für diese beiden Ansätze verwendet werden:

3 Stimmen

Model-First bedeutet nicht, den POCO zuerst zu kodieren, das ist Code First, Model-First ist ein Visual Designer, um automatisch POCOs zu generieren und danach Datenbanken aus dem Modell zu erzeugen.

0 Stimmen

Heutzutage kann man sowohl bei der visuellen als auch bei der Code-Route entweder zuerst das "Modell" oder zuerst die "Datenbank" erstellen. Bei der ersten Variante handelt es sich um einen manuellen Entwurf (entweder über den Code oder den visuellen Editor), bei der zweiten um den Aufbau einer Datenbank und die Erstellung des Modells (entweder POCOs oder EDMX).

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