28 February 2008 .NET 3.5, HowTo, LINQ, LINQ to SQL, O/R Mapper, O\R Mapping, SQL Server, SQL Server Compact Edition Robert Muehsig

Auf der VSone habe ich das erste mal von den SQL Server in der Compact Edition (Version 3.5 ist momentan aktuell) gehört. In dem dazugehörigen Blogeintrag habe ich bereits einige der wichtigsten Angaben zu dem SQL Server Compact Edition geschrieben.

Kurzzusammenfassung:

- SQL DB für bis zu 4 GB Daten
- Bekannte Tools nutzbar
- Benötigt keine Installation etc.
- Relationen sind einstellbar

Kleines Problem: Geht LINQ to SQL?

Wer einmal mit LINQ to SQL gearbeitet hat, wird es sicherlich schick finden - jedenfalls schicker als das normale ADO.NET Thema. Wenn man das allerdings ausprobiert, bekommt man eine Fehlermeldung:

image

Erstmal die Entwarnung: Es geht - mit einem kleinen Trick.

Doch langsam: Vorbereitung

Als erstes benötigen wir eine "Local Database":

image

Diese SQL Server Compact Edition Database erkennt man an der "sdf" Endung. Nachdem wir dies gemacht haben, kommt so ein Dataset Dialog - den einfach ignorieren und schließen. 

Jetzt legen wir unsere Tabellen an - der Dialog ist ähnlich wie beim SQL Management Studio:

image

Nachdem wir  nun eine Company Tabelle ("Id" = Guid, "Name" = nvarchar) & Employee ("Id" = Guid, "Firstname" = nvarchar, "Lastname" = nvarchar, "CompanyId" = Guid) können wir über ein Kontextmenü die Verknüpfung zwischen den beiden Tabellen einstellen:

image

Das entsprechende Menü:

image

Nachdem wir das haben, kommen wir nun zum eigentlichen Teil:

LINQ to SQL einsetzen

Bei einer normalen MDF oder einer SQL Server Tabelle kann man den Designer nehmen, allerdings ist dies momentan bei einer Compact Edition DB nicht möglich.

Allerdings gibt es ein kleines Tool namens "SQLMetal.exe", welches normalerweise unter diesem Pfad zu finden ist:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin

Die Datei "SQLMetal.exe" sowie die Config Datei habe ich einfach mit in mein Projektverzeichnis kopiert.

Danach wird es wie folgt aufgerufen:
SqlMetal.exe Database.sdf /dbml:Enterprise.dbml /namespace:SQLCompact /pluralize

Folgendes passiert: Die Database.sdf wird aufgerufen und es wird eine Enterprise.dbml erstellt - im Namespace "SQLCompact".

DBML dem Projekt hinzufügen

Damit man es im Projekt nutzen kann, muss man es noch einblenden:

image

... und am Ende sieht man sowas:

image

Müsste eigentlich bekannt vorkommen, oder? ;)

Update aus den Kommentaren: Es wird keine designer.cs Datei angelegt

Die Lösung wurde von David in diesen Stackoverflow Thread gefunden. Um die Designer.cs auch erzeugen zu lassen muss man unter den Eigenschaften der DBML-Datei "MSLinqToSQLGenerator” in die Eigenschaft "Benutzerdefiniertes Tool”/”Custom Tool” eintragen. Vielen Dank an den Hinweis an David.

Beispiel: Datensatz einfügen

Der Datacontext kann entweder über die verschiedenen Parameter anders benannt werden oder ist im Standardfall gleich mit dem sdf Namen. Sodass wir nun mit dem Code eine neue Firma einfügen können:

image

Also alles nix neues - der Connectionstring kann vom Serverexplorer unter "Eigenschaften" ausgelesen werden oder von dieser Website.

Jetzt können wir alles anwenden, was wir z.B. hier oder hier kennengelernt haben.

Hier gibts noch ein paar LINQ Informationen.

Viel Spaß :)

[Download Source Code]


Written by Robert Muehsig

Software Developer - from Saxony, Germany - working on primedocs.io. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de