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]

10 Kommentare bisher »

  1. karlw4 sagt

    am 10. April 2008 @ 15:18

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

  2. LINQ 2 SQL Server CE | oliana.de sagt

    am 6. Oktober 2008 @ 13:15

    [...] wird LINQ-2-SQLCE zwar unterstützt, aber nicht schön wie bei den großen SQL Servern. Hier habe ich nun eine Lösung gefunden wie das doch [...]

  3. SteveKr.devBlog » Kleines Tool für LINQ to SQL Server Compact sagt

    am 28. Dezember 2008 @ 18:44

    [...] LINQ to SQL bekanntlich nicht so ohne weiteres mit dem SQL Server Compact funktioniert (siehe http://code-inside.de/…) und man auf das Kommandozeilentool SQLMetal.exe zurückgreifen muss, was mitunter ein wenig nervig [...]

  4. Thomas sagt

    am 20. April 2009 @ 22:02

    Hey danke! :-)

  5. Simon sagt

    am 16. Juni 2009 @ 04:59

    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).

  6. Robert Mühsig sagt

    am 16. Juni 2009 @ 09:14

    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.

  7. links for 2009-08-24 | Xelluloid sagt

    am 25. August 2009 @ 02:08

    [...] HowTo: SQL Server Compact Edition mit LINQ to SQL verwenden | Code-Inside Blog 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 (tags: SQL Programming Linq) [...]

  8. David sagt

    am 22. Dezember 2009 @ 13:59

    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.

  9. peterchen sagt

    am 11. Februar 2010 @ 00:27

    Ganz einfach: Dankeschön! :D

  10. MyWebsolution sagt

    am 9. Juli 2010 @ 05:03

    @ 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 ;)

Komentar RSS · TrackBack URI

Hinterlasse einen Kommentar

Name: (erforderlich)

eMail: (erforderlich)

Website:

Kommentar: