Seit dem neuen Visual Studio 2008 und dem .NET Framework 3.5 stellt Microsoft die neue LINQ Technologie zur Verfügung. Durch den dazugehörigen Designer, kann mit LINQ to SQL spielend leicht ein Objekt aus der Datenbank erzeugt werden.Doch leider haben die Designer immer dieselben Nachteile. Sie grenzen die Flexibilität stark ein, Sie ist bei der .NET-Softwarearchitektur unabdingbar. Jede Schicht muss weiterhin auf die LINQ
to SQL Objekte zugreifen können ohne direkt mit der Datenbankschicht verbunden zu sein. Bisher gab es bereits kostenlose Lösungen, die ein O/R Mapping mit viel Flexibilität anbieten. Eines der Führenden war NHibernate,doch wird ständig nach einer Möglichkeit gesucht, NHibernate wie LINQ zu nutzen oder via LINQ anzusprechen. Es müsste also ein fertiges LINQ to SQL-Objekt in die Contract-Schicht, damit alle Schichten Zugriff bekommen. Allerdings muss das unabhängig ohne Designer geschehen, damit wir eigene Objekte nach Wunsch erzeugen können. Auch die Datenübertragung muss erst von der DataAccessLayer geschehen.
Es hilft uns also nur noch die LINQ to SQL Objekte manuell zu erzeugen, um unabhängig das Objekt von der Datenbankschicht verwenden zu können.
Flexibles Mapping beliebter Objekte
Als Beispiel wurde die Musterdatenbank Northwind für den SQL
Server 2008 eingesetzt. Dafür eignet sich die Tabelle "Customers"
bestens. Der Aufbau und die Typen der Tabelle sieht man bei Abb.1.
Abb. 1: Der Aufbau der Tabelle "Customers"
Anschließend wird für das Projekt unter der Contract-Schicht
eine Datenklasse angelegt, die alle Felder der Tabelle als Eigenschaften
abbildet. (Siehe Abb.2)
Abb. 2: Die Datenklasse "Customer" bildet die
Felder als Eigenschaften ab.
Um Customer nun manuell zu Mappen muss die Library "System.Data.Linq.Mapping"
eingebunden und der Namespace mittels Using eingesetzt werden. Nun stehen der
Klasse neue Attribute zur Verfügung. Mit [Table]
für die Datenbanktabelle und [Column] als
Feld der Tabelle, wird LINQ der Verweis manuell gekennzeichnet. Die Attribute
verfügen noch weitere Interessante Optionen. Wenn der Klassen- oder
Methodenname nicht dem Namen der Datenbanktabelle entspricht, kann durch "[Table(Name = "Costumers")]",
die Verknüpfung zum korrekten Feld angegeben werden. Um eine bessere Übersicht
zu erhalten, die Datenklasse "Customer" von Abb.2 erweitert durch
Attributen unter Abb.3.
Abb. 3: Die Datenklasse "Customer" mit manuellen
LINQ Attributen.
Microsoft bezeichnet diese Art des Mapping "Attribute-Based
Mapping". Weitere Optionen die bei den Attributen zur Verfügung stehen,
können unter folgenden Link nachgelesen werden: http://msdn.microsoft.com/en-us/bb386971.aspx
Nun wird in der DataAccessLayer ein DataContext mit ConnectionString erzeugt, dann
übermittelt "GetTable<>()"
die Datenklasse "Customer" die Zuweisung für DataContext. Der Rest
folgt wie gewohnt von LINQ. Als Beispiel um einen Datensatz zu speichern, siehe
Abb 4.
Abb. 4: Das Abspeichern von Daten in die Datenbank.
Desweiteren auch noch Beispiele um Daten zu lesen (Abb.5),
Updaten (Abb.6) und löschen(Abb.7).
Abb. 5: Das Lesen von der Datenbank.
Abb. 6: Das Updaten von Daten in die Datenbank.
Abb. 7: Das Löschen von Daten in der Datenbank.
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
