Repository Pattern Linq to sql verständnisproblem


Hyper Lord

Mitglied
Hallo,
ich beschäftige mich gerade mit linq to sql und repository pattern...
soweit leuchtet mir auch alles ein. Was ich nicht verstehe in allen Beispielen, die ich gefunden habe gab es zwar ein repository (meist generisch), aber man konnte noch immer auf den DataContext zugreifen.
Beispiel
Model Projekt enthält DataContext und Repository
Controler bekommt einen Verweis auf Model

Ich dachte, das das repository eine zwischenschicht zwischen z.B Controler und Datalayer ist, natürlich auch um eine CRUD zu implementieren, aber ohne das der Controler direkt auf den DataContext zugreift.

in einem Beispiel fürs EntityFramework wurde ein Project mit Pocos erstellt, die einfach in den Schichten hin und her gereicht werden konnten, der DataContext war getrennt vom Repository eine Schicht darunter, der Controler hat auf das Repository zugreifen können, aber nicht auf den DataContext...

Habe ich da was falsch verstanden, oder muss ich zusätzlich zu den erstelleten Pocos von LINQ2SQL meine eigenen erstellen, da diese ja normal im DataContext liegen?? ??

vielen dank im voraus
 

Hyper Lord

Mitglied
Vielen Dank für die Antwort, was mir an deinen Beispielen stark auffällt, die werden viel im mvc verwendet in asp?
Zusammendfassend habe ich das jetzt so verstanden:
Einheitliche CRUD implementation für jede Entität, mit dem Unit of Work Pattern zusammen hat man dann eine Zentrale stelle wo alle repositories liegen und abgerufen werden können, aber der DataContext wird mit übergeben...
http://mikehadlow.blogspot.co.at/2008/03/using-irepository-pattern-with-linq-to.html
dort wird ja letzentlich dann doch davon abgeraten LinqToSQL zu verwenden und generische Repositories sind auch nicht so der Hit?

Jetzt bin ich noch verwirrter als vorher, in dem einen artikel(diskussion wird gesagt, das das repository komplett von der app losgelöst sein soll

http://www.remondo.net/repository-pattern-example-csharp/
In diesem Beispiel wird gezeigt wie das ganze funktioniert, aber auch da wird der DataContext(Database) auch zur Testapp durchgereicht?
Sollte der DataContext nicht geschützt sein vor direktem zugriff?

Tut mir Leid, vielleicht bin ich einfach gerade zu Blöd das zu verstehen, aber ich verstehe es leider nicht

hier nochmal warum ich das nicht verstehe
http://www.heise.de/developer/artik...zugriff-und-Logik-1418915.html?artikelseite=2
da wird der Context einfach vom Model getrennt...
Zitat:
Außerdem soll der Entity-Framework-Kontext, der standardmäßig in der Assembly liegt, wo sich die .edmx-Datei befindet (also in WWWings_GO), in die WWWings_DZS verschoben werden. Der Grund liegt darin, dass die Vermengung von EF-Entitätsklassen und -Kontext in WWWings_GO dazu führen würde, dass die Benutzeroberfläche Zugang zum Kontext hätte (siehe Abb. 5). Der Client soll aber auf keinen Fall direkt auf die Datenbank zugreifen können.
Zitatende


Ist somit LinqToSQL ungeeignet oder anderst zu verwenden, da es da ja keine context.tt datei gibt, oder gibt es da eine andere möglichkeit?
Die einzige die mir jetzt spontan einfällt wäre eigene pocos erstellen und die selbst mit daten füllen, dann hätte ich das was ich bei linq2sql nicht ganz verstehe?!

Vielen dank für die Geduld mit mir
 

Hyper Lord

Mitglied
Ah, ich habe es endlich rausgefunden, es gibt zwar keine .tt datei, aber in der .designer.cs liegt ja der DataContext. Den kann man einfach auschneiden und in eine ander Klasse kopieren, dann hat man den Kontext in einer eigenen Datenzugriffsschicht liegen und kein direkten zugriff mehr auf datenbankoperationen man muss nur aufpassen, da man die.dbml datei nicht verschieben kann, das man diese erst in die Modelschicht einbaut und dann den Context rausschneidet!
Juhuh, das hat mir Tage geraubt...

Noch eine letzte Frage.

Ich habe eine starre Tabellenstruktur z.B. Tbl User, Tbl UserGroupes usw. ...
und ich habe eine dynamische Struktur, das heisst: User baut sich eine ansicht, dabei werden Textboxen erstellt wenn er diese speichert wird eine Tabelle nach diesen Vorgaben erstellt, das einzigste was immer gleich ist Feld ID Identifikation, der Rest wird so generiert, wie der User es braucht...

Meine Idee war, für die starre Struktur Linq2SQL Mapper zu verwenden und für die dynamische Struktur zu fuss zu programieren, ist das Sinvoll überhaupt einen Mapper einzusetzen und das zu vermischen?
 

ksk

Erfahrenes Mitglied
Was generiert sich sich der User eigentlich?
Beiträge, Fotos, Interessen usw.

Ich würde davor abraten Dynamisch Spallten in die Tabelle einzufügen.
Der eine User verwendet fünf der andere zwei und ein aderer wiederum zehn.
Du musst auch dabei um die Auswertung bzw. Abfragen usw. beachten falls du einer der Spalten ansprechen willst.
Und wenn, dann bau dir eine Tabelle mit den wichtigsten Columns und zusätzliche Bsp:
val1, val2, ..., val10 usw.
Somit hättest mal eine Obergränze die eigentlich reichen sollten.
Vielleicht lässt sich auch das was der User sich erstellt in Kategorieren unterteilen?

Lg
ksk
 

ComFreek

Mod | @comfreek
Moderator
Ich halte es für sehr schlecht, dynamisch Spalten einzufügen.

Erst vor kurzem habe ich dazu genau den perfekten Satz gelesen.
Er stammt von MichaelT in einem Beitrag auf Programmers.SE.
Q How does a BASIC coder count to 10?
A 1,2,3,4,5,6,7,8,9,10
Q How does a C coder count to 10?
A 0,1,2,3,4,5,6,7,8,9
Q How does a DBA count to 10?
A 0,1,many

Versuche einen Tabelle mit den Textboxen zu haben. Jede Textbox hat auch noch einen Typ (sofern du eine Kategorisierung brauchst), welcher auf eine Typtabelle verweist.
 

Hyper Lord

Mitglied
JA ich weiss was du meinst, aber in dem Fall ist das so ok, die Textbox Struktur ist so wie du sie vorgeschlagen hast, aber der Store in dem die Daten letzendlich gelagert werden ist immer eine getrennte Tabelle, pro Kunde/Kampagne/Skript.
Also der Admin erstellt ein Skript, darin erstellt er eine Seite oder mehr,, in denen er die gewünschten Textboxen/(EMail)Buttons/Kalender Options usw anlegt und positioniert, in dem Skript hat er noch die Möglichkeit diese Boxen und Seiten mit Javaskript zu steuern(z.B. Button ausblenden oder wenn Box a Option B gwält wird navigiere zu Seite B usw. dafür gibt es Vorgefertigte JS Funktionen) mit diesem Skript erstellt er eine Kampagne, wenn die Kampagne erstellt wird, wird die Tabelle mit Spalten nach Vorgabe des Skriptes angelegt. Nun kann er die Daten einspielen und die Kampagne Usern zuordnen, die die Daten nach Vorgabe an ihren Apps über webservices gesendet bekommen und abbarbeiten(Ein Service steuert wer welchen datensatz zu welcher kampagne gesendet bekommt, aber es kann immer nur einDatensatz vom User bearbeitet werden und mehrere User können nicht auf den gleichen Datensatz zugreifen, der User ist aber in der Lage die Daten zu verändern und den Datensatz abzuschliessen, dann wird er als erledigt markiert, oder ihn sich als Wiedervorlage zu reservieren). Diese Kampagnendaten dürfen auf keinen Fall mit anderen Daten vermischt werden und es ist niemals klar welche Felder und wieviele angelegt werden, aber mehrere Kampagnen können das gleiche Skript verwenden. Ein weiteres Programm fragt die Kampagnen Tabelle des Kunden aus dem SQL Server ab um Statistiken zu bauen, nach Benden wird die Kampagne/Tabelle nach Kundenvorgaben eingelagert für bestimmte Zeit oder direkt gelöscht usw. ...

Also der User generiert keine Spalten oder Tabellen,das kann nur der Admin(war ein bischen blöde ausgedrückt von mir), und der kann das auch nur wenn die Kampagne nicht gestartet ist. ich hoffe der Ausschnitt hat etwas licht ins Dunkle gebracht...
Es ist nicht so das man einen Kundendatensatz hat, dem man eine weitere Telnummer oder Adresse zuordnen möchte, oder ähnliches, das wäre extrem ineffizient dies so zu lösen.

Vielen Dank für eure Anregungen
 
Zuletzt bearbeitet: