Entity Framework VS LINQ zu SQL VS ADO.NET mit gespeicherten Prozeduren? [geschlossen]

430

Wie würden Sie jeden von ihnen bewerten in Bezug auf:

  1. Performance
  2. Entwicklungsgeschwindigkeit
  3. Ordentlicher, intuitiver, wartbarer Code
  4. Flexibilität
  5. Insgesamt

Ich mag mein SQL und war schon immer ein eingefleischter Fan von ADO.NET und gespeicherten Prozeduren, aber ich hatte kürzlich ein Spiel mit Linq to SQL und war überwältigt davon, wie schnell ich meine DataAccess-Ebene ausgeschrieben habe und mich für Ausgaben entschieden habe einige Zeit wirklich entweder Linq to SQL oder EF verstehen ... oder keine?

Ich möchte nur überprüfen, ob es bei keiner dieser Technologien einen großen Fehler gibt, der meine Forschungszeit unbrauchbar machen würde. ZB ist die Leistung schrecklich, sie ist cool für einfache Apps, kann Sie aber nur so weit bringen.

Update: Können Sie sich auf EF VS L2S VS SPs anstatt auf ORM VS SPs konzentrieren? Ich interessiere mich hauptsächlich für EF VS L2S. Aber ich bin sehr daran interessiert, sie auch mit gespeicherten Prozessen zu vergleichen, da ich über einfaches SQl viel weiß.

Britischer Entwickler
quelle
94
nicht konstruktiv und doch so viele positive Stimmen? ...;)
BritishDeveloper
34
Ich verstehe nicht, warum jemand dies als nicht konstruktiv markiert hat. Es scheint mir wirklich gut zu sein. +1 von mir.
Thanushka
10
Dies ist aus meiner Sicht eine ausgezeichnete Frage. Persönlich habe ich festgestellt, dass Entity Framework und alle ähnlichen ORMs langsamer sind als einfacher ADO.Net-Code. Ich habe diesen Test vor 2 Jahren und dann wieder vor einer Woche gemacht. Ich bin mir nicht sicher, wie LINQ to SQL mit EF verglichen wird. Aber ADO.Net wird immer die beste Leistung bringen. Wenn Sie Entwicklungszeit sparen möchten, ist Entity Framework ein gutes Tool, aber definitiv nicht, wenn die Leistung Ihr Hauptanliegen ist.
Sunil
2
@Timeless: Es gibt einen Trend, sich nicht auf Datenbankmechanismen zu verlassen. Jedes Datenbankmodul verfügt über eine eigene Sprache für gespeicherte Prozeduren, sodass zusätzliches Lernen erforderlich ist. 99,9% der Entwickler können sich auf ORMs verlassen, die recht guten Code produzieren und SQL automatisch erstellen. Der Leistungsunterschied ist bei einfachem CRUD gering. Gespeicherte Verfahren sind schwieriger zu entwickeln und zu warten. Vor ein paar Jahren, als es keine ORMs gab und nichts magisch und automatisch aus der Datenbank generiert wurde. Das Schreiben von SPs wurde als nicht so zeitaufwändig angesehen, da es eine Alternative zum Schreiben von SQL-Anweisungen in der Anwendung war.
LukLed
4
@ Sunil ist richtig, aber nicht wortreich genug. Das Problem ist, dass jeder denkt , dass sein Hauptanliegen die App-Leistung ist. Wenn ich über Apps spreche, die Spitzenleistung erfordern, denke ich an Hardcore-C ++ - MMOs oder hochvolumige, kundenorientierte Datenbanktransaktionen in Millionenhöhe. Sie sollten sich wirklich auf objektorientierte Prinzipien wie Wartbarkeit , Lesbarkeit , Persistenz-Ignoranz und Domänenlogik-Trennung konzentrieren . Insbesondere wenn die Leistungssteigerung in vielen Fällen bestenfalls geringfügig oder gar nicht vorhanden ist.
Suamere

Antworten:

430

Wenn Sie ein neues Projekt starten, entscheiden Sie sich zunächst für Entity Framework ("EF") - es generiert jetzt viel besseres SQL (eher wie Linq to SQL) und ist einfacher zu warten und leistungsfähiger als Linq to SQL (") L2S "). Ab der Veröffentlichung von .NET 4.0 halte ich Linq to SQL für eine veraltete Technologie. MS war sehr offen dafür, die L2S-Entwicklung nicht weiter fortzusetzen.

1) Leistung

Dies ist schwierig zu beantworten. Bei den meisten Single-Entity-Operationen ( CRUD ) ist die Leistung aller drei Technologien nahezu gleich. Sie müssen wissen, wie EF und Linq to SQL funktionieren, um sie optimal nutzen zu können. Bei großvolumigen Vorgängen wie Abfrageabfragen möchten Sie möglicherweise, dass EF / L2S Ihre Entitätsabfrage so "kompiliert", dass das Framework SQL nicht ständig neu generieren muss, oder dass Probleme mit der Skalierbarkeit auftreten können. (siehe Änderungen)

Bei Massenaktualisierungen, bei denen Sie große Datenmengen aktualisieren, ist Roh-SQL oder eine gespeicherte Prozedur immer leistungsfähiger als eine ORM-Lösung, da Sie die Daten nicht über die Leitung zum ORM marshallen müssen, um Aktualisierungen durchzuführen.

2) Entwicklungsgeschwindigkeit

In den meisten Szenarien wird EF nackte SQL / gespeicherte Prozesse in Bezug auf die Entwicklungsgeschwindigkeit umhauen. Der EF-Designer kann Ihr Modell aus Ihrer Datenbank aktualisieren, wenn es sich ändert (auf Anfrage), sodass Sie nicht auf Synchronisierungsprobleme zwischen Ihrem Objektcode und Ihrem Datenbankcode stoßen. Das einzige Mal, dass ich die Verwendung eines ORM nicht in Betracht ziehen würde, ist, wenn Sie eine Anwendung vom Typ Berichterstellung / Dashboard ausführen, in der Sie keine Aktualisierungen durchführen, oder wenn Sie eine Anwendung erstellen, um nur Rohdatenwartungsvorgänge für eine Datenbank durchzuführen.

3) Ordentlicher / wartbarer Code

Zweifellos schlägt EF SQL / Sprocs. Da Ihre Beziehungen modelliert sind, sind Verknüpfungen in Ihrem Code relativ selten. Die Beziehungen der Entitäten sind für den Leser bei den meisten Abfragen fast selbstverständlich. Nichts ist schlimmer, als von Schicht zu Schicht Debugging oder durch mehrere SQL / Middle Tier gehen zu müssen, um zu verstehen, was tatsächlich mit Ihren Daten passiert. EF bringt Ihr Datenmodell auf sehr leistungsstarke Weise in Ihren Code.

4) Flexibilität

Gespeicherte Prozesse und unformatiertes SQL sind "flexibler". Sie können Sprocs und SQL nutzen, um schnellere Abfragen für den jeweiligen Fall zu generieren, und Sie können native DB-Funktionen einfacher als mit und ORM nutzen.

5) Insgesamt

Lassen Sie sich nicht in die falsche Zweiteilung bei der Auswahl eines ORM oder der Verwendung gespeicherter Prozeduren verwickeln. Sie können beide in derselben Anwendung verwenden, und Sie sollten es wahrscheinlich tun. Big-Bulk-Operationen sollten in gespeicherten Prozeduren oder SQL (die tatsächlich von der EF aufgerufen werden können) ausgeführt werden, und EF sollte für Ihre CRUD-Operationen und die meisten Anforderungen Ihrer mittleren Ebene verwendet werden. Vielleicht möchten Sie SQL zum Schreiben Ihrer Berichte verwenden. Ich denke, die Moral der Geschichte ist die gleiche wie immer. Verwenden Sie das richtige Werkzeug für den Job. Aber das Dünne daran ist, dass EF heutzutage sehr gut ist (ab .NET 4.0). Wenn Sie es in Echtzeit lesen und gründlich verstehen, können Sie mühelos erstaunliche, leistungsstarke Apps erstellen.

BEARBEITEN : EF 5 vereinfacht diesen Teil ein wenig mit automatisch kompilierten LINQ-Abfragen , aber für wirklich hochvolumige Inhalte müssen Sie auf jeden Fall testen und analysieren, was in der realen Welt am besten zu Ihnen passt.

Dave Markle
quelle
35
Absolut geniale Antwort. Ich benutze jetzt tatsächlich EF, um schnell eine App zu entwickeln. Wenn die Leistung zu einem Problem wird, werden gespeicherte Prozesse aktiviert, um die schlecht funktionierenden EF-Abfragen zu überarbeiten. Vielen Dank!
BritishDeveloper
17
@BritishDeveloper: Vergessen Sie auch nicht, wie wichtig es ist, auch Ansichten zu verwenden. Es ist uns sehr gelungen, einige Ansichten in unseren L2S-Projekten zu definieren und sie dort einzusetzen, wo das Framework scheinbar schlechte Abfragen schreibt. Auf diese Weise erhalten wir alle Vorteile der Verwendung des Frameworks mit allen Vorteilen des Schreibens unseres eigenen SQL.
Dave Markle
5
Ich benutze auch Views;) Mehr als Workaround für die Nicht-Cross-DB-Einschränkung von EF. Gute Idee für die Optimierung. Vielen Dank
BritishDeveloper
5
Auf jeden Fall eine tolle Antwort. Ich wollte nur eine Beobachtung hinzufügen, die ich in meiner eigenen Erfahrung mit L2S gegen EF4 hatte. Von L2S -> EF4 gewechselt, nachdem wir festgestellt haben, dass wir möglicherweise mehrere verschiedene RDMBS verwenden ... aber während MSSQL noch ausgeführt wird, zeigte sich der Leistungsabfall hauptsächlich im GUI-Bereich meiner App. Die Datenbindung zur Ergebnismenge in L2S war viel schneller als in EF4. Es ist genau dieselbe Abfrage in genau derselben Datenbank. Eine Sache, die hier zu beachten ist, ist, dass ich mehr als 90.000 Datensätze zurückgebe, sodass der Unterschied ziemlich offensichtlich war. Vielleicht ist es bei kleineren Sets kein Problem? Ich
bin
5
Gute Antwort. Ich habe gerade 4 Wochen mit LINQ-to-Entities gearbeitet und versucht, alles hineinzuarbeiten, bevor mir endlich klar wurde, dass Sie natives SQL für Dinge wie Massenkopieren, Massenlöschen, ultraschnelles Entfernen von Duplikaten aus einer Datenbank usw. benötigen Das richtige Tool für den Job. Es ist keine Schande, natives SQL mit dem LINQ to Entities-Framework zu mischen.
Contango
93

Gespeicherte Prozeduren:

(+)

  • Große Flexibilität
  • Volle Kontrolle über SQL
  • Die höchste verfügbare Leistung

(-)

  • Erfordert SQL-Kenntnisse
  • Gespeicherte Prozeduren befinden sich außerhalb der Quellcodeverwaltung
  • Erhebliche Menge an "Wiederholen" bei Angabe derselben Tabellen- und Feldnamen. Die hohe Wahrscheinlichkeit, dass die Anwendung nach dem Umbenennen einer DB-Entität beschädigt wird und irgendwo Verweise darauf fehlen.
  • Langsame Entwicklung

ORM:

(+)

  • Schnelle Entwicklung
  • Datenzugriffscode jetzt unter Quellcodeverwaltung
  • Sie sind von Änderungen in der Datenbank isoliert. In diesem Fall müssen Sie Ihr Modell / Ihre Zuordnungen nur an einer Stelle aktualisieren.

(-)

  • Die Leistung kann schlechter sein
  • Keine oder nur geringe Kontrolle über SQL, das der ORM erzeugt (könnte ineffizient oder schlimmer fehlerhaft sein). Möglicherweise muss eingegriffen und durch benutzerdefinierte gespeicherte Prozeduren ersetzt werden. Dadurch wird Ihr Code unübersichtlich (einige LINQ im Code, einige SQL im Code und / oder in der Datenbank außerhalb der Quellcodeverwaltung).
  • Da jede Abstraktion "hochrangige" Entwickler hervorbringen kann, die keine Ahnung haben, wie es unter der Haube funktioniert

Der allgemeine Kompromiss besteht darin, eine große Flexibilität zu haben und viel Zeit zu verlieren, anstatt eingeschränkt zu sein, was Sie tun können, aber es sehr schnell erledigen zu lassen.

Es gibt keine allgemeine Antwort auf diese Frage. Es geht um heilige Kriege. Hängt auch von einem Projekt und Ihren Bedürfnissen ab. Finden Sie heraus, was für Sie am besten funktioniert.

AGuyCalledGerald
quelle
47
Ich denke nicht, dass die Punkte bezüglich der Quellcodeverwaltung relevant sind. Das Datenbankschema, gespeicherte Prozeduren, UDFs usw. können und sollten der Quellcodeverwaltung unterliegen.
Lee Gunn
15
+1 fürAs any abstraction can produce "high-level" developers having no idea how it works under the hood
Nawfal
3
Einverstanden ist das Quellcodeverwaltungsargument falsch. Wir speichern unsere Datenbankerstellungsskripte immer in svn. Wie können Sie die Datenbank bei der Entwicklung einer Datenbankanwendung sogar außerhalb der Quellcodeverwaltung halten?
Wout
3
EF ist nicht wirklich für hohe Verfügbarkeit und hohe Leistung geeignet. Ich bin kein DBA-Typ, aber ich sehe nicht, was EF bietet, was das Codieren erleichtert.
Jamie
4
Daher geben wir Flexibilität, volle Kontrolle und Leistung für eine "schnelle Entwicklung" auf und vermeiden Codeänderungen, wenn sich die Datenbank ändert. Klingt für mich nach purer Faulheit.
user2966445
18

Ihre Frage ist im Grunde O / RM gegen Handschrift SQL

Verwenden Sie ein ORM oder einfaches SQL?

Schauen Sie sich einige der anderen O / RM-Lösungen an, L2S ist nicht die einzige (NHibernate, ActiveRecord).

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software

um die spezifischen Fragen zu beantworten:

  1. Abhängig von der Qualität der O / RM-Lösung kann L2S ziemlich gut SQL generieren
  2. Dies ist normalerweise viel schneller mit einem O / RM, sobald Sie den Prozess durchgeführt haben
  3. Code ist normalerweise auch viel ordentlicher und wartbarer
  4. Straight SQL bietet Ihnen natürlich mehr Flexibilität, aber die meisten O / RMs können alle bis auf die kompliziertesten Abfragen ausführen
  5. Insgesamt würde ich vorschlagen, mit einem O / RM zu gehen, der Flexibilitätsverlust ist vernachlässigbar
BlackICE
quelle
@ David Danke, aber es ist nicht ORM vs SQL. Ich möchte zu ORM wechseln und frage mich, welche Zeit ich in das Lernen investieren soll: EF oder L2S (es sei denn, sie sind Müll im Vergleich zu gespeicherten Prozessen)
BritishDeveloper
1
Ich würde definitiv sagen, dass sie im Vergleich zu gespeicherten Prozessen kein Müll sind, und ein Nebeneffekt ist, dass Sie keinen Code in der Datenbank verbreitet haben. Persönlich mag ich L2S, aber ich habe zu diesem Zeitpunkt noch nicht viel mit EF gemacht, und es scheint, dass L2EF es ersetzen wird, also würde ich EF gehen. Sobald Sie Linq gehen, gehen Sie auch nicht zurück.
BlackICE
13

LINQ-to-SQL ist eine bemerkenswerte Technologie, die sehr einfach zu verwenden ist und im Großen und Ganzen sehr gute Abfragen an das Back-End generiert. LINQ-to-EF sollte es ersetzen, war jedoch in der Vergangenheit äußerst umständlich zu verwenden und erzeugte weitaus minderwertiges SQL. Ich kenne den aktuellen Stand der Dinge nicht, aber Microsoft hat versprochen, alle Vorteile von L2S in L2EF zu migrieren. Vielleicht ist jetzt alles besser.

Persönlich habe ich eine leidenschaftliche Abneigung gegen ORM-Tools ( Einzelheiten finden Sie in meiner Diatribe hier ), und daher sehe ich keinen Grund, L2EF zu bevorzugen, da L2S mir alles bietet, was ich jemals von einer Datenzugriffsschicht erwarten würde. Ich denke sogar, dass L2S-Funktionen wie handgefertigte Zuordnungen und Vererbungsmodellierung eine völlig unnötige Komplexität verursachen. Aber das bin nur ich. ;-);

Marcelo Cantos
quelle
1
L2S ist ziemlich gut, hat aber den Nachteil, dass Microsoft erklärt hat, dass sie im Grunde nicht viel in die Erweiterung investieren werden. Sie können die Ergebnisse bereits in der neuesten Version sehen, in der nur wenige Fehlerbehebungen und Unterstützung für SQL Server 2008-Datentypen hinzugefügt wurden.
FinnNk
Einverstanden, @FinnNk. Es ist eine bedauerliche Tatsache, dass die Verwendung von L2S aufgrund seines Paria-Status etwas riskant ist. Aber wenn sie es wirklich vollständig zugunsten von L2EF abgespeist hätten, hätte ich den starken Verdacht, dass es einen Migrationspfad geben würde, da das Folgende immer noch Spaß macht.
Marcelo Cantos
3
Linq to EF ist ausgereift und produziert jetzt SQL so gut wie L2S (ab .NET 4.0). L2EF ist heutzutage viel besser als L2S, da es zumindest Ihr Modell aktualisieren kann, wenn sich die Datenbank ändert, was L2S niemals automatisch tun könnte. Ich mag auch die Tatsache, dass Sie einfache M: M-Beziehungen mit EF als Beziehungen abbilden können, ohne eine Zwischenentität zu benötigen. Es macht den Code so viel sauberer.
Dave Markle
2
Danke für das Update @Dave. Ich bin jedoch nicht mit dem M: M-Kommentar einverstanden. Die Schemas, mit denen ich gearbeitet habe, erweitern fast immer zusätzliche Attribute für Verknüpfungstabellen. Dies führt zu einer strukturellen Änderung des Objektmodells, die viel Code-Nacharbeit erfordert. Ich würde mich viel lieber von Anfang an explizit mit der Zwischenbeziehung befassen.
Marcelo Cantos
1

Es gibt einen völlig neuen Ansatz, den Sie möglicherweise in Betracht ziehen sollten, wenn Sie nach der Leistung und Leistung gespeicherter Prozeduren und der schnellen Entwicklung suchen, die Tools wie Entity Framework bieten.

Ich habe SQL + für eine Probefahrt in einem kleinen Projekt genommen, und es ist wirklich etwas Besonderes. Grundsätzlich fügen Sie Ihren SQL-Routinen Kommentare hinzu, und diese Kommentare enthalten Anweisungen für einen Codegenerator, der dann eine wirklich schöne objektorientierte Klassenbibliothek auf der Grundlage der tatsächlichen SQL-Routine erstellt. Ein bisschen wie ein Entity Framework in umgekehrter Richtung.

Eingabeparameter werden Teil eines Eingabeobjekts, Ausgabeparameter und Ergebnismengen werden Teil eines Ausgabeobjekts, und eine Servicekomponente stellt die Methodenaufrufe bereit.

Wenn Sie gespeicherte Prozeduren verwenden möchten, aber dennoch eine schnelle Entwicklung wünschen, sollten Sie sich dieses Material ansehen.

Vincent
quelle