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:
Erstmal die Entwarnung: Es geht – mit einem kleinen Trick.
Doch langsam: Vorbereitung
Als erstes benötigen wir eine "Local Database":
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:
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:
Das entsprechende Menü:
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:
… und am Ende sieht man sowas:
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:
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ß




karlw4
10. April 2008
Sehr gut gemacht!
Ein einfache und übersichtliche Erklärung, die man auf Microsoft-Seiten nicht findet!
Thomas
20. April 2009
Hey danke!
Simon
16. June 2009
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).
Robert Mühsig
16. June 2009
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.
David
22. December 2009
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.
peterchen
11. February 2010
Ganz einfach: Dankeschön!
MyWebsolution
9. July 2010
@ 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
cardox
4. January 2011
Hallo,
gibt es eine Möglichekeit, eine Password-geschützte sdf datenbank mit SqlMetal zu verarbeiten? ein /password:geheim funktioniert leider nicht.
Patrick
26. March 2011
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
Robert Mühsig
27. March 2011
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.