Sollten wir Entity Framework verwenden?


31

Wir haben derzeit den folgenden Stack:

  • VS 2005
  • Webformulare
  • SQL Server 2005
  • IIS 6

Wir planen, darauf umzusteigen:

  • VS 2010
  • MVC und Web Forms
  • SQL Server 2008
  • IIS 7

Meine Frage ist, ob wir bei einem Wechsel zu MVC mit VS 2010 Entity Framework (oder ein anderes ORM), ein Mikro-ORM (wie Massive ) oder nur einfaches SQL verwenden sollen.

Alle Tutorials, die ich über VS 2010 gelesen habe, sind darauf ausgerichtet, Entity Framework für Datentransaktionen zu verwenden. Wird es das in absehbarer Zukunft geben (ab 5 Jahren)?

Wenn es darauf ankommt, können die Anwendungen unserer Kunden zwischen 10 und 1.000 aktive Benutzer haben.


Verwenden Sie derzeit Linq-to-SQL?
Morgan Herlocker

Wir verwenden parametrisiertes SQL
Guanome

4
Vermeiden Sie die direkte Verwendung von SQL in Ihrer zukünftigen Entwicklung. ORM oder EF sind fast ein Muss. Widme dich irgendwann einer Strategie für deine Datenzugriffsschicht. Es ist eine kritische Entscheidung und keine triviale Aufgabe. Stellen Sie sicher, dass Sie und das Team genügend Zeit haben, dies zu lernen. Die Einführung neuer Kerntechnologien in das Team muss verwaltet werden. Wählen Sie das Werkzeug aus, wählen Sie das Material aus, machen Sie eine Ausbildung, ... und bewerten und entscheiden Sie dann.
NoChance

2
Neue oder bestehende Datenbanken? Es gibt möglicherweise einen großen Unterschied zwischen dem Erstellen einer neuen Datenbank unter Berücksichtigung der Konventionen von EF und dem Versuch, EF auf eine vorhandene Datenbank nachzurüsten, die nicht für ORMs erstellt wurde.
rmac

@rmac Es war für eine neue Datenbank.
Guanome

Antworten:


45

Ich habe kürzlich von Inline-SQL-Abfragen zu EF gewechselt und Folgendes gefunden:

Vorteile

  • Viel schneller zum Erstellen der DAL (ich liebe es, keine SQL-Abfragen zu schreiben!)
  • Viel einfacher zu pflegen
  • Sie müssen nicht mehr daran denken, meine Eingaben zu analysieren, bevor Sie eine Inline-SQL-Anweisung erstellen. Dies bedeutet, dass die Wahrscheinlichkeit eines SQL-Injection-Angriffs geringer ist.

Nachteile

  • Kann nicht mehrere Datenbanken umfassen ... zumindest nicht leicht
  • Alle Entitäten (Tabellen, Ansichten usw.) benötigen einen Primärschlüssel
  • Wenn Sie eine einzelne Spalte in einer über 100 erforderlichen Spaltentabelle aktualisieren möchten (nicht mein Tabellendesign), müssen Sie alle 100 Spalten herunterziehen, um die Aktualisierung durchzuführen. Oder verwenden Sie eine gespeicherte Prozedur.
  • Es gab Probleme mit Standardwerten, die auf SQL Server definiert wurden und nicht in das Entitätsmodell übernommen wurden, nachdem ein neuer Datensatz hinzugefügt wurde. In der Regel sind dies berechnete Werte oder Werte, die in einem INSERT-Trigger hinzugefügt werden
  • Gelegentlich werden die SQL-Abfragen schlecht geschrieben und nur langsam ausgeführt. Wenn Sie eine langsam laufende Abfrage haben, führen Sie eine SQL-Ablaufverfolgung durch, um zu sehen, was EF tut. Möglicherweise können Sie diese Abfrage als SP oder View überarbeiten. Das kommt allerdings nicht so oft vor.
  • Es gab einige Probleme beim Versuch, eine Zuordnung zwischen Tabellen zu erstellen, für die in SQL Server kein Fremdschlüssel definiert ist. Normalerweise liegt es daran, dass ich versuche, eine 1:0-1Beziehung zu erstellen, in der EF a verwenden möchte1:0-*

Ich bin allerdings kein EF-Experte, daher habe ich wahrscheinlich einige Dinge verpasst. Dies sind nur die Elemente, auf die ich in der Vergangenheit beim Wechsel von Inline-SQL zu Entity Framework gestoßen bin. Ich bin froh, dass ich den Wechsel vollzogen habe, aber es gab Zeiten, in denen ich EF aufgrund seiner Macken wirklich hasste.


7
+1 für detaillierte und organisierte Antwort. "Alle Entitäten (Tabellen, Views usw.) benötigen einen Primärschlüssel" klingt eher nach einer vernünftigen Einschränkung als nach einem Con.
NoChance

2
@EmmadKareem Es ist eine gute Einschränkung, wenn Sie die Kontrolle über die Datenbank haben, aber wenn Sie mit einer Datenbank eines Drittanbieters oder mit Ansichten arbeiten, kann es etwas ärgerlich sein
Rachel

1
Versuchen Sie einfach, EF in einer nicht verbundenen N-Tier-Web-App zu verwenden - Aktualisieren von Entitäten in einer Sitzung und von MM-Beziehungen, hmmmmm, was für ein Spaß!
Vidar

5
@EmmadKareem-Entitäten benötigen wirklich einen einwertigen Primärschlüssel - die Verwendung von zusammengesetzten Schlüsseln ist in EF ein Albtraum. Dies ist eher ein Nachteil als eine vernünftige Einschränkung.
Kirk Broadhurst

1
Ich würde sagen, Sicherheit ist ein weiteres Problem. Viele denken, dass jeder DB-Zugriff gespeicherte Prozeduren mit DB-Rollen durchlaufen sollte, um zu bestimmen, welche Anmeldungen welche gespeicherten Procs ausführen können. Dies schließt EF / LINQ zum Erstellen von Abfragen aus. Ich habe EF verwendet, bin aber auf Kunden gestoßen ( Husten Microsoft), die diese Sicherheitsanforderungen hatten
Mick

12

Entity Framework ist ein Produktivitätswerkzeug. Verwenden Sie die besten verfügbaren Tools, es sei denn, Sie haben einen guten Grund, dies nicht zu tun (z. B. Sie arbeiten mit SQL 2000 oder haben keine Zeit, die Technologie zu verbessern).

Abgesehen davon finde ich das Konzept von Entities sehr gut auf das Modell des MVC-Musters übertragbar. Obwohl eine 1: 1-Beziehung zu Modellen und Tabellen eine schlechte Praxis ist, führt das Denken in Bezug auf Entitäten tendenziell zu sauberen Designs und leicht lesbarem Code (insbesondere mit LINQ).

Entity Framework wird von Microsoft aktiv unterstützt. Niemand hat eine magische Kristallkugel zu sagen "Unterstützung wird X Jahre dauern". Ich sehe keinen Grund zu der Annahme, dass Entity in den nächsten 5 Jahren sterben wird.


3
LinqToSql ist ziemlich schnell gestorben, es gibt also keinen Grund zu der Annahme, dass Entity Framework überleben wird. Es lohnt sich, den neuen Vorstoß von MS in Richtung Metro in Betracht zu ziehen, da sie möglicherweise eine Überarbeitung vieler ihrer Angebote in Betracht ziehen.
ocodo 20.10.11

3
Slomojo, vielleicht haben Sie eine andere Definition als der Rest der Welt des Wortes "Dead". Weil LinqToSql gerade nicht mehr aktiv entwickelt wird. Sie können es in 10-20 Jahren noch verwenden.
Boris Yankov

4

Eine andere mögliche Lösung ist die Verwendung einer alternativen Entity Framework-Bibliothek, die nicht im Lieferumfang von VS enthalten ist. Es gibt einige im Internet.

Das Entity / 3-Layer-Framework-Konzept ist seit einiger Zeit auf dem Markt und hat, wie viele andere Entwickler, mit mehreren benutzerdefinierten Bibliotheken zusammengearbeitet, bevor Microsoft sein eigenes "offizielles" Framework herausbrachte.

Vorteile

Nutzen Sie die Vorteile des Entity (DAL) -Frameworks, ohne an ständigen Änderungen der Microsoft-Bibliotheken / -Frameworks festzuhalten.

Hinzufügen von Funktionen zu einer Bibliothek, die der vorhandenen offiziellen Bibliothek möglicherweise nicht zur Verfügung stehen, z. B. die Verwendung mehrerer Datenbankmarken.

Nachteile

Müssen die Bibliothek oder Tools unterstützen. Es ist sehr verbreitet, ein Entity-Generator-Code-Tool zu haben, um die Enitites zu generieren.


Ich finde diese Antwort sehr verwirrend. Es gibt nur ein Entity Framework (mit Großbuchstaben), das von Microsoft hergestellt wird. Meinen Sie "ein anderes Objekt relationalen Mapper verwenden"? Entity Framework ist kein Oberbegriff - es ist der Name von Microsoft ORM.
NickG

Obwohl es ein "Microsoft Entity Framework" gibt, gibt es das "Entity Framework" -Konzept bereits seit mehreren Jahren.
Umlcat

3

Sie müssen eine architektonische Entscheidung treffen, die auf dem Problem und der vorhandenen Lösung basiert. Wie bei jeder Technologie gibt es Vor- und Nachteile.

Ich persönlich würde normalerweise das Entity-Framework für Neuentwicklungen verwenden, aber bestehenden Code nicht umschreiben. Sie erhalten dann die Geschwindigkeit für zukünftige Entwicklungen, müssen aber nicht viel Zeit in die Konvertierung von Code investieren. Der Nachteil dieses Ansatzes ist, dass die Konsistenz verringert wird.


3
+1 für die Empfehlung, den Arbeitscode nicht neu zu schreiben.
NoChance

2

In Ihrer Situation würde ich definitiv Entity Framework verwenden. Ich habe festgestellt, dass es gut mit MVC funktioniert.
Hier sind einige echte Gründe und Hinweise.

  • Die Verwendung von Linq ist eine Freude, und die verzögerte Ausführung ist auch äußerst nützlich.
  • Sie können Ihre Modelle generieren. Wenn Sie jedoch mit mvc arbeiten, wird empfohlen, Ansichtsmodelle in Verbindung mit den Datenmodellen zu verwenden. Dies erleichtert die Validierung und Modellbindung erheblich. Wenn Sie diesen Ansatz wählen , ordnen Sie die Änderungen mit automapper wieder Ihren Daten zu Datenmodell).

Es gibt jedoch eine Reihe von Dingen, die Sie über die Verwendung eines ORM lernen müssen.

  • Was der Kontext für Sie tut (Entity Tracking)
  • Dass ein Kontext als Arbeitseinheit genutzt werden sollte
  • Denken Sie daran, was die Parallelität betrifft. EF kann Ihnen mitteilen, wenn Ihr Objekt veraltet ist, aber es kann schwierig sein, die Parallelität zwischen Anforderungen richtig zu handhaben (da Sie einen Zeitstempel oder etwas anderes benötigen).

Dinge, die man beachten muss

  • Trigger und ORMs funktionieren nicht zusammen, verwenden Sie stattdessen die ORM-Ereignisse.
  • Stellen Sie sicher, dass alle Ihre Tische Promary-Schlüssel haben.

Ich würde den Code-First-Ansatz auch sehr empfehlen, selbst wenn Sie eine vorhandene Datenbank haben.

  • Die Konventionen bedeuten, dass Sie keine Zuordnungen oder Klassen neu erstellen müssen, wenn Sie die Datenbank ändern.
  • Es ist einfacher, Validierung und andere Logik in die Modelle einzufügen.
  • Sie können den Codegenerator verwenden, um sie zu erstellen, wenn Sie über eine große vorhandene Datenbank verfügen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.