HowTo: SQL Server Compact Edition mit LINQ to SQL verwenden

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]


Kick It auf dotnet-kicks.de
Wenn dir der Blogpost gefallen hat, dann hinterlasse doch einen Kommentar. Wenn du auf dem Laufenden bleiben willst, abonniere unseren RSS Feed oder folge uns auf Twitter.

About the author

Written by Robert Mühsig

Robert Mühsig (@robert0muehsig) ist Webentwickler und beschäftigt sich mit Web-Frameworks (vor allem dem ASP.NET MVC Framework) und scheut sich auch nicht vor Javascript. Ansonsten bloggt er über all jene Probleme, die ihm über den Weg laufen. Seit 2008 ist er Microsoft MVP für ASP.NET und er arbeitet bei der T-Systems Multimedia Solutions GmbH in Dresden. Treffen kann man ihn online via Twitter (@robert0muehsig) oder dieser Seite oder bei der .NET User Group Dresden.

14 Responses

  1. Sehr gut gemacht!
    Ein einfache und übersichtliche Erklärung, die man auf Microsoft-Seiten nicht findet!

    Reply
  2. Hey danke! :-)

    Reply
  3. Ist die SQL Server Compact Edition zusammen mit VS 2008 ****====> WebDev <====**** Express sinnvoll ?

    Ich brauche auf einer neuen WebSite eine kleine schlanke DB, soweit waere die Compact Edition OK fuer mich – und ich moechte dem Hoster keine 10 Eier pro Monat brennen fuer eine SQL DB.

    Aber mir ist nicht klar, ob ich bei einem Hoster/Provider die Compact-DLL (wie auch die .sdf-Datei) in meine Anwendungsverzeichnisse ftp-en, und dann spaeter aus meiner Web-Anwendung verwenden kann.

    Wenn’s prinzipiell geht, muss man ev. gewisse Restriktionen beachten (z.B. mehrere Threads welche auch gleiche DB wollen).

    Reply
    • Also generell ist die Compact Edition nicht für den Einsatz auf einem Webserver vorgesehen. Es sollte allerdings gehen. Deine .sdf sollte aber im App_Data Ordner liegen, weil dort der ASP.NET Prozess schreibrechte hat. Die Compact-DLL sollte im Bin auch funktionieren. Allerdings geht die Webseite sicherlich zu Brüche wenn mehrere Nutzer auf dieser sind. Aber das müsste man mal ausprobieren.

      Reply
  4. Ich hatte gerade das Problem, dass keine designer.cs-Datei erzeugt wurde.

    Unter folgendem Link habe ich dann die Lösung für das Problem gefunden: http://stackoverflow.com/questions/133515/autogeneration-of-a-datacontext-designer-file-when-using-sqlmetal-and-visual-stud

    Mann muss unter Eigenschaften der DBML-Datei “MSLinqToSQLGenerator” in die Eigenschaft “Benutzerdefiniertes Tool”/”Custom Tool” eintragen.

    Reply
  5. Ganz einfach: Dankeschön! :D

    Reply
  6. @ David
    Danke für den Hinweis! Das sollte möglichst in den Post übernommen werden… hab nämlich auch lange danach suchen müssen, bis ich mir hier die Comments durchgelesen hab ;)

    Reply
  7. Hallo,
    gibt es eine Möglichekeit, eine Password-geschützte sdf datenbank mit SqlMetal zu verarbeiten? ein /password:geheim funktioniert leider nicht.

    Reply
  8. Hallo,

    danke erstmal für das gute HowTo. Damit findet man den Einstieg ziemlich schnell. Aber eine Frage habe ich dann doch: Wie gehe ich denn am besten vor, wenn ich eine Spalte in einer meiner DB-Tabellen einfügen will? Kann ich den Code der Entity-Klassen dann wieder mit SQLMetal aktualisieren oder direkt im DB-Designer aktualisieren`?

    Viele Grüße
    Patrick

    Reply
  9. Mittlerweile soll SQL CE 4 auch das Entity Framework (Linq2Sql wird ja ohnehin nicht weiterentwickelt) supportet: http://weblogs.asp.net/scottgu/archive/2010/06/30/new-embedded-database-support-with-asp-net.aspx

    Bei SQL CE 3.5: Kann ich dir gar nicht sagen ob man das direkt im Designer aktualisieren kann oder nicht. Im schlimmsten Fall via SQLMetal das Model neu erstellen.

    Reply

Comment on this post

Letzte Posts

  • Carriage Return / Neue Zeile in Textareas

    Eine kleine Aufgabe: Jede neue Textzeile (Carriage Return/Wenn man Enter drückt ) in einer Textarea soll ein Element in einer Auflistung sein – wie mach ich das jetzt am einfachsten? Eigentlich ein grundlegendes Element im Web und der Nutzer macht bewusst Absätze – daher wäre es nur gerecht, wenn man das auch entsprechend würdigt. Kleine ...

  • image.png
    Doom, Quake, Wolfenstein & co. Source Code auf GitHub

    id Software, die Macher von Doom, Quake, Wolfenstein & co., stellen regelmäßig ihre älteren Spieltitle als Open Source zur Verfügung. Das Ganze runterzuladen fand ich bisher immer recht mühselig, allerdings gibt es seit kurzer Zeit die Sourcen auch auf GitHub. Darunter Spiele wie Doom 3, Quake 3, Wolfenstein für iOS. Wer also schon immer mal ...

  • image.png
    Twitter Bootstrap 2.0 released & “Release Präsentation”

    Wie bereits vom Twitter Bootstrap Team angekündigt wurde offiziel die Version 2.0 des UI Toolskits “Twitter Bootstrap” veröffentlich. Zudem wurden die Slides, welche bei der Release Party gezeigt wurden auch veröffentlicht: Downloads finden sich auf der Twitter Bootstrap Seite auf GitHub. Wenn dir der Blogpost gefallen hat, dann hinterlasse doch einen Kommentar. Wenn du auf ...

  • image.png
    Javascript zu Dart Translator

    Dart, Google Javascript Alternative, wurde vor ein paar Monaten vorgestellt und die Webentwickler Szene ist noch etwas gespalten, ob Dart nun überflüssig ist oder einfach nur cool und längst überfällig ist. Um die Sprache näher zu erläutern hat Google die grundlegenden Javascript Basics nach Dart übersetzt. Das Ergebnis ist der “Translator”. Der Name mag momentan ...

  • Twitter Bootstrap 2.0–“Beta”

    Twitter Bootstrap, ein UI-Toolkit für Web-Applikationen von Twitter, erscheint (wie bereits berichtet) demnächst in der Version 2.0. Der offizielle Release ist am 31. Januar, allerdings beginnt jetzt laut Mark Otto (einer der Hauptentwickler von Twitter Bootstrap) die intensive Test-Phase. Das heisst, das es nun offiziel auch die 2.0 Dokumentation online gibt. Im Vergleich zur aktuellen ...

Support us!

Facebook