2008-10-27 22 views
7

Ich habe gerade angefangen, meine Datenzugriffsschicht mit LinqToSql zu erstellen. Jeder redet über die coole Syntax und ich mag Linq im Allgemeinen.LinqToSql Best Practices

Aber als ich sah, wie Ihre Klassen erzeugt werden, wenn Sie einige Tabellen auf dem LinqContext ziehen, war ich erstaunt: So viel Code, den niemand braucht ?!

So sah ich, wie andere Menschen LinqToSql, zum Beispiel Rob Connery bei seiner StoreFront Demo verwendet.

Da mir die Art und Weise, wie dieser Code erzeugt wird, nicht gefällt, habe ich meine Domain-Ebene von Hand erstellt und die generierten Klassen als Referenz verwendet. Mit dieser Lösung geht es mir gut, da ich die von Linq zur Verfügung gestellten Funktionen nutzen kann (verzögerte Ausführung, Lazy Loading, ...) und meine Domain-Ebene ziemlich einfach zu verstehen ist.

Wie verwenden Sie LinqToSql?

Antwort

6

Die erstellten Klassen sind nicht so schwer wie es scheint. Natürlich braucht es ein paar Zeilen Code, aber alles in allem ist es so leicht wie es sein kann für die Funktionen, die es bietet.

Ich habe auch meine eigenen Tabellen erstellt, aber jetzt benutze ich nur den LINQtoSQL DataContext. Warum? Das Erstellen ist einfacher, die Features sind besser, Interoperabilität funktioniert, es ist wahrscheinlich sogar schneller als meine eigenen Sachen (nicht in jeder Hinsicht. Normalerweise waren meine eigenen Sachen in einer Sache extrem schnell, aber die generischen Sachen waren in allem anderen schneller).
Aber der wichtigste Teil: es ist einfacher, neue Entwickler in die LINQ-Sachen als in meine eigenen zu bringen. Es gibt Tutorials, Beispielcodes, Dokumentation, alles, was ich selbst für meinen Code erstellen müsste. Das Gleiche gilt für die Verwendung meiner Inhalte mit anderen Technologien wie WCF oder Datenbindung. Es gibt viele Fallstricke, um die man sich kümmern muss.

Ich habe gelernt, mich nicht auf die harte Tour in eine Ecke zu entwickeln, es sieht am Anfang schnell und einfach aus, ist viel lustiger als zu lernen, wie man die libs benutzt, aber ist ein echter Schmerz in der a nach ein paar Monate die Straße hinunter, normalerweise sogar für mich selbst.

Nach einiger Zeit die Neuheit der Erstellung meiner eigenen Daten Container abnutzt, und ich bemerkte den Schmerz mit dem Hinzufügen einer Funktion verbunden. Ein Feature, das ich kostenlos gehabt hätte, wenn ich die bereitgestellten Klassen benutzt hätte.
Als nächstes musste ich meinen Code einem anderen Programmierer erklären. Hätte ich die zur Verfügung gestellten Klassen benutzt, hätte ich ihn auf eine Webseite verweisen können, um etwas über das Zeug zu lernen. Aber für meinen Unterricht musste ich ihn selbst ausbilden, was sehr lange dauerte und es schwierig machte, neue Leute für ein Projekt zu gewinnen.

0

Verwenden Sie kompilierte Abfragen. Linq to SQL ist sonst langsam Hund. Really.

+0

Ich bin wirklich interessiert, warum dies abgelehnt wurde. Wir verwenden Linq-to-SQL in der Produktion und mussten die meisten Abfragen in kompilierte umschreiben und wir haben eine 10-fache Leistungssteigerung erhalten. – bh213

0

Wir verwenden unser handgefertigtes Domänenmodell zusammen mit den generierten Klassen und einem einfachen Dienstprogramm, das bei Bedarf Reflektionen verwendet, um zwischen diesen zu konvertieren. Wir haben erwogen, einen Konvertergenerator zu schreiben, wenn wir einen Punkt erreichen, an dem die Reflektion einen Leistungsengpass erzeugt.

+0

Ich dachte darüber nach, aber ging den Weg, den Jeff Fritz erwähnte. Keine Reflexion benötigt! – Vyrotek

4

LinqToSql generiert eine Reihe von Teilklassen für Ihre Tabellen. Sie können Schnittstellendefinitionen zur "anderen Hälfte" dieser Teilklassen hinzufügen, die Ihr Domänenmodell implementieren.

Wenn Sie dann das Repository-Muster verwenden, um den Zugriff auf die Linq-Abfragen zu umbrechen, sodass sie Schnittstellenimplementierungen Ihrer Objekte zurückgeben (die zugrunde liegenden Linq-Objekte), wird LinqToSql ziemlich flexibel.

+0

Ich wollte genau das posten. Schön zu hören, dass andere es so benutzen. – Vyrotek

+0

Mein Team verwendet eine ähnliche Technik mit stark typisierten Datensätzen und fügt Schnittstellenimplementierungen zu den partiellen Klassen hinzu, die Vs.Net generiert –

+0

Sind das irgendwelche Codebeispiele? Ich habe im Grunde genommen meine Domain mit Dependency-Injection-Modell geschrieben, um die db zu verspotten. Jetzt mache ich meine LINQ to SQL-Datenbank und kämpfe darum, wie ich mein Business-Objekt x mit meinem linq-Objekt x ohne lahme Konvertierung effektiv abbilden kann – qui

1

Sie können Ihre eigenen Klassen manuell schreiben und entweder die LINQ to SQL-Attribute verwenden, um die Zuordnungen zu deklarieren, oder eine externe XML-Datei.

Wenn Sie mit dem vorhandenen Designer bleiben und nur den Code-Generierungsprozess ändern möchten, nehmen Sie meine templates that let you tailor the generated code.