Sollte ich Entity Framework-, DataSet- oder Custom-Klassen verwenden?

c# dataset entity-framework wcf

Frage

Ich habe es wirklich schwer hier. Ich muss eine "Desktop-App" entwerfen, die WCF als Kommunikationskanal verwendet. Es ist eine mehrschichtige Anwendung (DB und Anwendungsserver sind identisch, der Client geht durch die Internet-Cloud).

Die Anwendung ist etwas komplexer (in Bezug auf SQL und Codelogik) als die üblichen LOB-Anwendungen, aber das Konzept ist dasselbe: Lesen von DB, Aktualisieren in DB, Verwalten von Parallelität usw. Mein Problem ist, dass das Entity Framework jetzt in Beim Öffnen kann ich nicht entscheiden, wie ich vorgehen soll: Sollte ich Entity Framework, Dataset oder Custom Classes verwenden?

So wie ich es von Entity Framework verstanden habe, wird es auch die Objektzuordnung meiner Datenbanktabellen gleichzeitig mit den CRUD-Skripts erstellen. Das ist alles gut und gut für einfache CRUDs, aber meistens ist das "Auswählen" komplex und erfordert eine benutzerdefinierte SQL. Ich verstehe, dass ich gespeicherte Prozeduren in EF verwenden kann (ich mag SP nicht, ich weiß nicht warum, ich mag es, meine SQL in der DAL von Hand zu schreiben, ich fühle mich auf diese Weise sicherer und bequemer).

Mit DataSet verwende ich meine benutzerdefinierten SQL-Dateien und fülle den Datensatz auf. Mit benutzerdefinierten Klassen (Objekte für DB-Tabellen) fülle ich meine benutzerdefinierten SQL-Werte für diese benutzerdefinierten Klassen (Sammlungen und Listen usw.) auf. Ich möchte EF verwenden, aber ich fühle mich nicht sicher bei der Bereitstellung einer Anwendung, deren SQL-Code ich nicht geschrieben habe und nicht im Code sehen kann. Fehlt mir hier etwas?

Jede Hilfe in dieser Hinsicht wäre sehr dankbar.

Xeshu

Akzeptierte Antwort

Ich stimme Marc G. zu. 100% - DataSets sind scheiße, vor allem in einem WCF-Szenario (sie verursachen viel Aufwand für die Bearbeitung von In-Memory-Datenmanipulationen) - verwenden Sie diese nicht. Für Anfänger und zweischichtige Desktop-Apps in kleinem Umfang sind sie in Ordnung - aber ich würde sie nicht in einer seriösen, professionellen App verwenden.

Im Grunde geht es bei Ihrer Frage darum, wie Sie Ihre Zeilen aus der Datenbank in etwas konvertieren, das Sie über WCF hinweg entfernen können. Dies bedeutet eine Art von Mapping - entweder tun Sie es selbst, verwenden DataReaders und legen dann alle Daten in WCF-Klassen [DataContract] Sie können dies sicherlich tun, gibt Ihnen die ultimative Kontrolle, ist aber auch langweilig, mühsam und fehlerbehaftet. anfällig.

Oder Sie lassen einige vorgefertigte ORM-Funktionen für dieses Grunzen erledigen. Wählen Sie zwischen Linq-to-SQL (großartig, benutzerfreundlich, flexibel, aber nur SQL Server), EF v4 (bis März 2010 verfügbar) sehr vielversprechend, sehr flexibel) oder jeder andere ORM, wirklich - was immer Ihren Bedürfnissen am besten entspricht.

Andere ernsthafte Konkurrenten im ORM-Bereich könnten Subsonic 3.0 und NHibernate (unter vielen anderen) sein.

Also zusammenfassend:

  • vergessen Sie die Datensätze
  • Entweder haben Sie 100% Kontrolle und die Zuordnung zwischen SQL und Ihren Objekten selbst
  • Sie lassen sich von einem fähigen ORM (Linq-to-SQL, EF v4, Subsonic, NHibernate ua) erledigen - das ist wirklich nicht so wichtig, dh es ist auch eine Frage der persönlichen Vorlieben und des Codierstils

Expertenantwort

Ich kann keine Datensätze befürworten, vor allem in einer SOA-Umgebung wie WCF - es funktioniert zwar, aber meistens aus falschen Gründen. Sie sind einfach nicht portabel und IMO "arbeitet" nicht wirklich über Service-Grenzen hinweg. Natürlich funktionieren IMO auch in den meisten anderen Szenarien nicht ;-p

Dann kommt es darauf an, wieviele Rohrleitungen Sie machen möchten. Die meisten ORMs erstellen für Sie WCF-serialisierbare Typen. persönlich würde ich momentan LINQ-to-SQL verwenden; Es ist sowohl einfacher als auch vollständiger als EF, obwohl EF 4.0 in 3.5sp1 wesentlich besser als EF sein soll. Sie können benutzerdefiniertes TSQL verwenden (über ExecuteQuery , das immer noch die Zuordnung zu Objekten durchführt), aber ich neige dazu, entweder SPROC (für komplexe Abfragen) oder LINQ-generierte Abfragen (für einfache Anfragen) zu verwenden.

Das Schreiben der Typen ist auch in Ordnung und funktioniert mit NHibernate usw. So viele Optionen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum