Welche Vor- und Nachteile hat die Verwendung von Entity Framework 4.1 Code-first gegenüber Model / Database-first mit EDMX-Diagramm?
Ich versuche, alle Ansätze zum Erstellen der Datenzugriffsschicht mit EF 4.1 vollständig zu verstehen. Ich verwende 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 ihn ModelBuilder
zur Feinabstimmung des Schemas.
Ich kann auch ein EDMX
Diagramm erstellen und einen Codegenerierungsschritt auswählen, der T4-Vorlagen verwendet, um dieselben POCO
Klassen zu generieren .
In beiden Fällen erhalte ich ein agnostisches POCO
Objekt ORM
und einen Kontext, der sich daraus ergibt DbContext
.
Database-first scheint am ansprechendsten zu sein, da ich eine Datenbank in Enterprise Manager entwerfen, das Modell schnell synchronisieren und mithilfe des Designers optimieren kann.
Was ist der Unterschied zwischen diesen beiden Ansätzen? Geht es nur um die Präferenz VS2010 gegenüber Enterprise Manager?
quelle
Antworten:
Ich denke die Unterschiede sind:
Code zuerst
Datenbank zuerst
Modell zuerst
Ich gehe davon aus, dass es im Fall von EF 4.1 einige andere Funktionen gibt, die sich auf Code First vs. Model / Database First beziehen. Die zuerst in Code verwendete fließende API bietet nicht alle Funktionen von EDMX. Ich gehe davon aus, dass Funktionen wie die Zuordnung gespeicherter Prozeduren, Abfrageansichten, das Definieren von Ansichten usw. funktionieren, wenn Modell / Datenbank zuerst verwendet wird und
DbContext
(ich habe es noch nicht ausprobiert), aber nicht zuerst im Code.quelle
DbContext
, das inObjectContext
einfachem Gebrauch existiert((IObjectContextAdapter)dbcontext).ObjectContext
.Ich denke, dieser einfache "Entscheidungsbaum" von Julie Lerman, der Autorin von "Programming Entity Framework", sollte helfen, die Entscheidung mit mehr Vertrauen zu treffen:
Mehr Infos hier .
quelle
Datenbank zuerst und Modell zuerst hat keine wirklichen Unterschiede. Der generierte Code ist derselbe und Sie können diese Ansätze kombinieren. Sie können beispielsweise eine Datenbank mit dem Designer erstellen, dann 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 ist diese Einschränkung sehr streng und erlaubt nicht, Code zuerst in der Produktion zu verwenden. Im Moment ist es nicht wirklich verwendbar.
Der zweite kleine Nachteil des Codes besteht darin, dass der Modellbauer Berechtigungen für die Masterdatenbank benötigt. Dies hat keine Auswirkungen auf Sie, wenn Sie die SQL Server Compact-Datenbank verwenden oder den Datenbankserver steuern.
Der Vorteil von Code ist zunächst sehr sauberer und einfacher Code. Sie haben die volle Kontrolle über diesen Code und können ihn einfach ändern und als Ansichtsmodell verwenden.
Ich kann empfehlen, den Code First-Ansatz zu verwenden, wenn Sie eine einfache eigenständige Anwendung ohne Versionierung erstellen und zuerst model \ database in Projekten verwenden, die in der Produktion geändert werden müssen.
quelle
Zitieren der relevanten Teile von http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework
quelle
Code-first scheint der aufgehende Stern zu sein. Ich habe mir Ruby on Rails kurz angesehen, und ihr Standard ist Code-First mit Datenbankmigrationen.
Wenn Sie eine MVC3-Anwendung erstellen, hat Code meiner Meinung nach zunächst die folgenden Vorteile:
Aktualisieren
Die Frage verlangt auch einen Vergleich von Code-First mit EDMX-Modell / DB-First. Code-first kann auch für beide Ansätze verwendet werden:
quelle
Ich verwende zuerst die EF-Datenbank, um mehr Flexibilität und Kontrolle über die Datenbankkonfiguration zu bieten.
EF-Code zuerst und Modell zuerst schienen cool zu sein und bieten Datenbankunabhängigkeit. Dabei können Sie jedoch nicht angeben, was ich als sehr grundlegende und allgemeine Informationen zur Datenbankkonfiguration betrachte. Zum Beispiel Tabellenindizes, Sicherheitsmetadaten oder einen Primärschlüssel, der mehr als eine Spalte enthält. Ich finde, ich möchte diese und andere gängige Datenbankfunktionen verwenden und muss daher trotzdem einige Datenbankkonfigurationen direkt durchführen.
Ich finde, dass die Standard-POCO-Klassen, die während der DB zuerst generiert wurden, sehr sauber sind, jedoch keine sehr nützlichen Datenanmerkungsattribute oder Zuordnungen zu gespeicherten Prozeduren aufweisen. Ich habe die T4-Vorlagen verwendet, um einige dieser Einschränkungen zu überwinden. T4-Vorlagen sind fantastisch, insbesondere wenn sie mit Ihren eigenen Metadaten und Teilklassen kombiniert werden.
Das Modell scheint zunächst viel Potenzial zu haben, gibt mir aber viele Fehler beim Refactoring komplexer Datenbankschemata. Nicht sicher warum.
quelle
Die Arbeit mit großen Modellen war vor dem SP1 sehr langsam (habe es nach dem SP1 nicht versucht, aber es wird gesagt, dass dies jetzt ein Kinderspiel ist).
Ich entwerfe immer noch zuerst meine Tabellen, dann generiert ein selbst erstelltes Tool die POCOs für mich, sodass es die Last übernimmt, sich wiederholende Aufgaben für jedes Poco-Objekt auszuführen.
Wenn Sie Versionsverwaltungssysteme verwenden, können Sie den Verlauf Ihrer POCOs leicht verfolgen. Mit vom Designer generiertem Code ist dies nicht so einfach.
Ich habe eine Basis für meinen POCO, was viele Dinge ziemlich einfach macht.
Ich habe Ansichten für alle meine Tabellen, jede Basisansicht enthält grundlegende Informationen für meine Fremdschlüssel und meine Ansicht POCOs stammen aus meinen POCO-Klassen, was wiederum sehr nützlich ist.
Und schließlich mag ich keine Designer.
quelle
Beispiel für den ersten Ansatz der Datenbank:
Ohne Code zu schreiben: ASP.NET MVC / MVC3-Datenbank Erster Ansatz / Datenbank zuerst
Und ich denke, es ist besser als andere Ansätze, weil der Datenverlust bei diesem Ansatz geringer ist.
quelle
IMHO Ich denke, dass alle Modelle einen großartigen Platz haben, aber das Problem, das ich mit dem Modell-First-Ansatz habe, besteht in vielen großen Unternehmen, in denen DBAs die Datenbanken steuern. Sie erhalten nicht die Flexibilität, Anwendungen zu erstellen, ohne Datenbank-First-Ansätze zu verwenden. Ich habe an vielen Projekten gearbeitet und als es um die Bereitstellung ging, wollten sie die volle Kontrolle.
So sehr ich mit allen möglichen Variationen einverstanden bin: Code First, Model First, Database First, müssen Sie die tatsächliche Produktionsumgebung berücksichtigen. Wenn Ihr System also eine große Benutzerbasisanwendung mit vielen Benutzern und Datenbankadministratoren sein soll, die die Show ausführen, sollten Sie die erste Option der Datenbank nur meiner Meinung nach in Betracht ziehen.
quelle
Ich denke, einer der Vorteile von Code ist, dass Sie alle Änderungen sichern können, die Sie an einem Versionskontrollsystem wie Git vorgenommen haben. Da alle Ihre Tabellen und Beziehungen in im Wesentlichen nur Klassen gespeichert sind, können Sie in der Zeit zurückgehen und sehen, wie die Struktur Ihrer Datenbank zuvor war.
quelle