445 Stimmen

Entity Framework VS LINQ to SQL VS ADO.NET mit gespeicherten Prozeduren?

Wie würden Sie die einzelnen Unternehmen in Bezug auf folgende Aspekte bewerten?

  1. Leistung
  2. Geschwindigkeit der Entwicklung
  3. Sauberer, 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 vor kurzem habe ich Linq to SQL ausprobiert und war überwältigt davon, wie schnell ich meine DataAccess-Schicht geschrieben habe, und ich habe beschlossen, einige Zeit damit zu verbringen, entweder Linq to SQL oder EF wirklich zu verstehen... oder weder noch?

Ich möchte mich nur vergewissern, dass keine dieser Technologien einen großen Fehler aufweist, der meine Forschungszeit nutzlos machen würde. Z.B. ist die Leistung schrecklich, es ist cool für einfache Anwendungen, aber es kann einen nur so weit bringen.

Aktualisierung: Können Sie sich auf EF VS L2S VS SPs konzentrieren und nicht auf ORM VS SPs. Ich interessiere mich hauptsächlich für EF VS L2S. Aber ich bin sehr daran interessiert, sie auch mit Stored Procs zu vergleichen, da ich mich mit einfachem SQl gut auskenne.

442voto

Dave Markle Punkte 91733

Wenn Sie ein neues Projekt beginnen, sollten Sie sich zunächst für Entity Framework ("EF") entscheiden - es generiert jetzt viel besseres SQL (ähnlich wie Linq to SQL) und ist einfacher zu warten und leistungsfähiger als Linq to SQL ("L2S"). Seit der Veröffentlichung von .NET 4.0 betrachte ich Linq to SQL als eine veraltete Technologie. MS hat sich sehr offen dazu geäußert, die Entwicklung von L2S nicht weiter voranzutreiben.

1) Leistung

Diese Frage ist schwierig zu beantworten. Bei den meisten Vorgängen, die nur eine Einheit betreffen ( CRUD ) werden Sie mit allen drei Technologien eine nahezu gleichwertige Leistung erzielen. Sie müssen allerdings wissen, wie EF und Linq to SQL funktionieren, um sie optimal nutzen zu können. Für hochvolumige Operationen wie Abfragen sollten Sie EF/L2S Ihre Entitätsabfrage "kompilieren" lassen, damit das Framework die SQL nicht ständig neu generieren muss, da es sonst zu Skalierungsproblemen kommen kann. (siehe Bearbeitungen)

Für 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 transportieren müssen, um Aktualisierungen durchzuführen.

2) Geschwindigkeit der Entwicklung

In den meisten Szenarien wird EF naked SQL/stored procs in puncto Entwicklungsgeschwindigkeit in den Schatten stellen. Der EF-Designer kann Ihr Modell von Ihrer Datenbank aus aktualisieren, wenn es sich ändert (auf Anfrage), so dass Sie keine Probleme mit der Synchronisierung zwischen Ihrem Objektcode und Ihrem Datenbankcode haben. Die einzige Zeit, in der ich die Verwendung eines ORM nicht in Betracht ziehen würde, ist, wenn Sie eine Anwendung vom Typ Bericht/Dashboard erstellen, in der Sie keine Aktualisierungen vornehmen, oder wenn Sie eine Anwendung erstellen, die nur zur Pflege von Rohdaten in einer Datenbank dient.

3) Ordentlicher/wartbarer Code

EF ist zweifellos besser als SQL/sprocs. Da Ihre Beziehungen modelliert sind, kommen Joins in Ihrem Code relativ selten vor. Die Beziehungen zwischen den Entitäten sind für den Leser bei den meisten Abfragen fast selbstverständlich. Nichts ist schlimmer, als von einer Ebene zur anderen gehen zu müssen, um zu debuggen oder mehrere SQL/Middle-Tiers zu durchlaufen, um zu verstehen, was eigentlich mit Ihren Daten geschieht. EF bringt Ihr Datenmodell auf eine sehr leistungsfähige Weise in Ihren Code ein.

4) Flexibilität

Stored Procs und Raw SQL sind "flexibler". Sie können Sprocs und SQL nutzen, um schnellere Abfragen für den einen oder anderen Sonderfall zu generieren, und Sie können die native DB-Funktionalität leichter nutzen als mit einem ORM.

5) Insgesamt

Lassen Sie sich nicht von der falschen Dichotomie zwischen ORM und gespeicherten Prozeduren einwickeln. Sie können beide in derselben Anwendung verwenden, und das sollten Sie auch tun. Große Massenoperationen sollten in gespeicherten Prozeduren oder SQL (die tatsächlich von EF aufgerufen werden können) durchgeführt werden, und EF sollte für Ihre CRUD-Operationen und die meisten Bedürfnisse Ihrer mittleren Schicht verwendet werden. Vielleicht möchten Sie SQL für die Erstellung Ihrer Berichte verwenden. Ich denke, die Moral der Geschichte ist die gleiche wie immer. Verwenden Sie das richtige Werkzeug für die jeweilige Aufgabe. Aber das Entscheidende ist, dass EF heutzutage sehr gut ist (seit .NET 4.0). Verbringen Sie etwas Zeit damit, es gründlich zu lesen und zu verstehen, und Sie können mit Leichtigkeit einige erstaunliche, leistungsstarke Anwendungen erstellen.

EDIT : EF 5 vereinfacht diesen Teil ein wenig mit automatisch kompilierte LINQ-Abfragen Aber wenn es um wirklich große Mengen geht, müssen Sie auf jeden Fall testen und analysieren, was für Sie in der realen Welt am besten geeignet ist.

97voto

Gespeicherte Prozeduren:

(+)

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

(-)

  • Erfordert Kenntnisse in SQL
  • Gespeicherte Prozeduren sind außerhalb der Quellenkontrolle
  • Erhebliche Anzahl von "Wiederholungen" bei der Angabe der gleichen Tabellen- und Feldnamen. Die hohe Wahrscheinlichkeit, dass die Anwendung nach der Umbenennung einer DB-Entität und dem Fehlen einiger Verweise darauf irgendwo zusammenbricht.
  • Langsame Entwicklung

ORM:

(+)

  • Schnelle Entwicklung
  • Datenzugriffscode jetzt unter Quellenkontrolle
  • Sie sind von den Änderungen in der DB isoliert. Wenn das passiert, brauchen Sie Ihr Modell/Ihre Zuordnungen nur an einer Stelle zu aktualisieren.

(-)

  • Leistung kann schlechter sein
  • Keine oder nur geringe Kontrolle über das vom ORM erzeugte SQL (könnte ineffizient oder sogar fehlerhaft sein). Möglicherweise müssen Sie eingreifen und sie durch benutzerdefinierte gespeicherte Prozeduren ersetzen. Das wird Ihren Code unübersichtlich machen (etwas LINQ im Code, etwas SQL im Code und/oder in der DB außerhalb der Quellcodekontrolle).
  • Da jede Abstraktion "High-Level"-Entwickler hervorbringen kann, die keine Ahnung haben, wie es unter der Haube funktioniert

Im Allgemeinen besteht ein Kompromiss zwischen einer großen Flexibilität und einem großen Zeitverlust einerseits und einer eingeschränkten, aber sehr schnellen Erledigung andererseits.

Auf diese Frage gibt es keine allgemeine Antwort. Es ist eine Frage der heiligen Kriege. Es kommt auch auf das jeweilige Projekt und Ihre Bedürfnisse an. Suchen Sie sich das aus, was für Sie am besten funktioniert.

18voto

BlackICE Punkte 8598

Ihre Frage ist im Grunde O/RMs gegenüber handgeschriebenem SQL

Mit einem ORM oder einfachem 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. Hängt von der Qualität der O/RM-Lösung ab, L2S ist ziemlich gut im Generieren von SQL
  2. Mit einem O/RM geht das normalerweise viel schneller, wenn man den Prozess erst einmal verstanden hat.
  3. Der Code ist in der Regel auch viel übersichtlicher und besser wartbar.
  4. Straight SQL bietet Ihnen natürlich mehr Flexibilität, aber die meisten O/RMs können alle Abfragen außer den kompliziertesten durchführen.
  5. Insgesamt würde ich ein O/RM vorschlagen, der Verlust an Flexibilität ist vernachlässigbar.

14voto

Marcelo Cantos Punkte 173498

LINQ-to-SQL ist eine bemerkenswerte Technologie, die sehr einfach zu verwenden ist und im Großen und Ganzen sehr gute Abfragen für das Backend erzeugt. LINQ-to-EF sollte es verdrängen, war aber in der Vergangenheit extrem umständlich in der Anwendung und erzeugte weitaus schlechteres SQL. Ich kenne den aktuellen Stand der Dinge nicht, aber Microsoft hat versprochen, alle Vorzüge von L2S in L2EF zu migrieren, also ist vielleicht alles besser geworden.

Ich persönlich habe eine leidenschaftliche Abneigung gegen ORM-Tools (siehe meine Hetzrede aquí für die Details), und daher sehe ich keinen Grund, L2EF zu bevorzugen, da L2S mir alles bietet, was ich von einer Datenzugriffsschicht erwarte. Ich bin sogar der Meinung, dass L2S-Features wie handgefertigte Mappings und Vererbungsmodellierung zu einer völlig unnötigen Komplexität führen. Aber das ist nur meine Meinung. ;-)

1voto

Vincent Punkte 832

Es gibt einen ganz neuen Ansatz, den Sie in Betracht ziehen sollten, wenn Sie die Leistungsfähigkeit von gespeicherten Prozeduren und die schnelle Entwicklung, die Tools wie Entity Framework bieten, suchen.

Ich habe SQL+ in einem kleinen Projekt getestet, und es ist wirklich etwas Besonderes. Sie fügen Ihren SQL-Routinen so etwas wie Kommentare hinzu, und diese Kommentare liefern Anweisungen für einen Code-Generator, der dann eine wirklich schöne objektorientierte Klassenbibliothek auf der Grundlage der eigentlichen SQL-Routine erstellt. Sozusagen ein umgekehrtes Entity Framework.

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

Wenn Sie gespeicherte Prozeduren verwenden möchten, aber trotzdem eine schnelle Entwicklung wünschen, sollten Sie sich diese Dinge ansehen.

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