Die Anwendung, die ich gerade erst erstelle, verwendet gespeicherte Prozeduren und handgefertigte Klassenmodelle, um Datenbankobjekte darzustellen. Einige Leute haben vorgeschlagen, Entity Framework zu verwenden, und ich denke darüber nach, dorthin zu wechseln, da ich noch nicht so weit im Projekt bin. Mein Problem ist, ich habe das Gefühl, dass die Leute, die für EF streiten, mir nur die gute Seite der Dinge erzählen, nicht die schlechte Seite :)
Meine Hauptanliegen sind:
- Wir möchten eine clientseitige Validierung mithilfe von DataAnnotations, und es klingt, als müsste ich sowieso clientseitige Modelle erstellen, sodass ich nicht sicher bin, ob EF so viel Codierungszeit einsparen würde
- Wir möchten die Klassen so klein wie möglich halten, wenn wir über das Netzwerk gehen, und ich habe gelesen, dass die Verwendung von EF häufig zusätzliche Daten enthält, die nicht benötigt werden
- Wir haben eine komplexe Datenbankschicht, die mehrere Datenbanken umfasst, und ich bin nicht sicher, ob EF damit umgehen kann. Wir haben eine gemeinsame Datenbank mit Benutzern, Statuscodes, Typen usw. und mehreren Instanzen unserer Hauptdatenbanken für verschiedene Instanzen der Anwendung. SELECT-Abfragen können und werden über alle Instanzen der Datenbanken hinweg abgefragt. Benutzer können jedoch nur Objekte ändern, die sich in der Datenbank befinden, an der sie gerade arbeiten. Sie können die Datenbank wechseln, ohne die Anwendung neu zu laden.
- Objektmodi sind sehr komplex und es sind oft einige Verknüpfungen beteiligt
Argumente für EF sind:
- Parallelität. Ich müsste nicht vor jedem Speichern in Schecks codieren, um zu sehen, ob der Datensatz aktualisiert wurde
- Codegenerierung. EF kann Teilklassenmodelle und POCOs für mich generieren. Ich bin jedoch nicht sicher, dass dies mir wirklich so viel Zeit ersparen würde, da ich denke, dass wir noch clientseitige Modelle für die Validierung und einige benutzerdefinierte Analysemethoden erstellen müssten.
- Entwicklungsgeschwindigkeit, da die gespeicherten CRUD-Prozeduren nicht für jedes Datenbankobjekt erstellt werden müssten
Unsere aktuelle Architektur besteht aus einem WPF-Dienst, der Datenbankaufrufe über parametrisierte gespeicherte Prozeduren, POCO-Objekte, die zum / vom WCF-Dienst und dem WPF-Client gehen, und dem WPF-Desktop-Client selbst, der POCOs zum Zweck der Validierung und in Klassenmodelle umwandelt Datenbindung.
Also meine Frage ist, ist EF richtig dafür? Gibt es irgendwelche Fallstricke bei EF, von denen ich nichts weiß?
quelle
Antworten:
Ich habe kürzlich Entity Framework evaluiert. Der beste Ort, an dem ich Probleme und fehlende Funktionen gefunden habe, war: http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions
Die Artikel mit den meisten Stimmen:
Es gibt noch viele weitere Probleme in der User Voice-Liste.
Ich freue mich ziemlich auf die bevorstehende Veröffentlichung von EF 4.1, die den Code-First-Ansatz enthalten wird ... http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4 -1-Release-Kandidat-verfügbar.aspx
Das könnte mich dazu bringen, EF in einer Produktionsanwendung zu testen.
quelle
.ToList()
oder.ToArray
), bevor Ihre LINQ-Ausdrücke vollständig definiert sind. Deshalb zieht es alle Datensätze und macht es langsam.Das Ausführen von Branch-per-Bug / Feature mit EF kann beim Zusammenführen sehr schmerzhaft sein. Stellen Sie sich vor, dass zwei Zweige A und B Änderungen an der Datenbank vornehmen (was wahrscheinlich in den frühen Phasen eines neuen Projekts häufig vorkommt).
Sie führen alle "normalen" Dateien zusammen - cs-Dateien usw. Und dann ist es Zeit, Model.edmx zusammenzuführen. Und plötzlich verbinden Sie nicht nur die logischen Zuordnungen zwischen Ihrem Objektmodell und der Datenbank, sondern auch die Positionen der Tabellen im Entitätsdiagramm.
Das Zusammenführen von Model.edmx ist so schmerzhaft, dass wir eine ziemlich böse Methode gewählt haben, die funktioniert:
quelle
EF bietet Ihnen noch einige weitere Vorteile:
Die Nachteile (insbesondere, wenn Sie die Validierung verwenden):
object
Typen, sodass nur die Metadaten gelesen werden können. Immer noch viel zusätzlichen inaktiven Code.Das sind die beiden größten Beschwerden, die ich habe. Es gibt eine Reihe von Vorteilen, aber möglicherweise können Sie die gleichen Vorteile von NHibernate nutzen. Wenn EntityFramework auf dem Tisch liegt, lassen Sie das Team auch NHibernate überprüfen und schnell nach den Vor- und Nachteilen für Ihr Projekt suchen .
Das Metadatenklassenproblem bereitet mir Kopfschmerzen, aber zum Glück habe ich nur so viele Entitäten, die Validierungs-Tags benötigen.
Das Fehlen eines echten getrennten Modus für Ihre Objekte schränkt die Möglichkeiten in einer Webumgebung ein. Der angehängte Modus eignet sich besser für Desktopanwendungen, aus denen eine Reihe von Innovationen von Microsoft hervorgegangen sind. Freistehender Modus ist möglich , aber sehr schmerzhaft. Verwenden Sie in diesem Fall am besten ein alternatives Tool.
quelle
using(EFConnection conn = new EFConnection)
Konstrukts stattfinden müssen. Wenn Sie versuchen, dieses Objekt an einem sicheren Ort zu verwahren, damit Sie ein schnelles Update durchführen und es in einer zweitenusing(...)
Anweisung erneut speichern können, müssen Sie erneut darüber nachdenken. Siehe msdn.microsoft.com/en-us/library/bb896271.aspx und msdn.microsoft.com/en-us/library/bb896248.aspx . Die Verwendung von EF 3.5 (das ich in der letzten Version verwenden musste) ist nicht einmal so sauber.Eine Sache, in der Microsoft nicht besonders gut ist, ist
dieAbwärtskompatibilität, insbesondere bei neuen TechnologienInsbesondere EF1 (.net 3.5) unterscheidet sich stark von EF4 (.net 4.0) - dies kann auch bei der nächsten Version der Fall sein.
Ich würde eine Weile warten und sehen, wie die Technologie reift.
In der Zwischenzeit sollten Sie nHibernate in Betracht ziehen - es ist nicht äquivalent, aber es ist ausgereift und wird häufig verwendet.
quelle
knacken ...
Ich könnte eine 10-seitige Diatribe schreiben. Aber wenn Sie nur eine Wurf-App für Unternehmen X schreiben, wen interessiert das dann? Aber wenn Sie ein Softwareprodukt entwickeln ... müssen Sie viel mehr anal sein
quelle
Überprüfen Sie dies: http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/
Die wichtigsten Punkte sind:
Beachten Sie, dass der obige Link über EF1 spricht.
Auch dieser Link: http://ormeter.net/ zeigt, dass EF im Vergleich zu anderen ORMs in Bezug auf Leistung und LINQ-Unterstützung nicht das Beste ist.
quelle