Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
In den letzten Artikel haben wir oft die SQLite-Datenbank als Beispieldatenbank verwendet. Nun kann es allerdings durch einen falschen Connection-String oder eine verschobene, gelöschte oder leere Datenbank dazu kommen, dass die Anwendung nicht über das Entity Framework auf die Datenbank zugreifen kann. Dieser Artikel beschreibt einige Szenarien, in denen das der Fall ist und zeigt, wie Sie beim Start der Anwendung prüfen können, ob die Quell-Datenbank erreichbar ist und diese gegebenenfalls neu auswählen.
Die SQLite-Datenbank ist eine sehr praktische Datenquelle für einfache Anwendungen, die keinen SQL Server benötigen. Sie kommt als eine einzige Datei daher und die Treiber können bequem in ein Projekt integriert werden – auch die Weitergabe ist überhaupt kein Problem. Was aber ein Problem sein könnte, wissen Access-Entwickler, die Datenbanken in Front- und Backend aufgeteilt haben, nur zu gut: Die Datenbankdatei könnte sich nicht an dem Ort befinden, der in der Verbindungszeichenfolge des Frontends angegeben ist.
Mit einem .NET-WPF-Projekt und einer SQLite-Datenbank haben Sie ein klassisches Frontend-Backend-Szenario, wie es auch bei aufgeteilten Access-Datenbanken vorliegt. Im Gegensatz zur Konstellation mit einem SQL Server haben Sie keine Server-Angabe im Connection-String, sondern Sie müssen den Namen der Datenbank, gegebenenfalls mit Angabe des Pfades zu dieser Datenbank, angeben. Wenn Sie ein Entity Data Model zu Ihrem Projekt hinzugefügt und die Datenbankdatei, zum Beispiel Bestellverwaltung.db, als Datenquelle ausgewählt haben, schreibt der Entity Data Model-Assistent eine Verbindungszeichenfolge in die Datei App.config, die etwa wie folgt aussieht:
<configuration> ... <connectionStrings> <add name="BestellverwaltungEntities" connectionString="...;provider=System.Data.SQLite.EF6;provider connection string="data source=c:\Beispiel\Bestellverwaltung.db"" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>
Hier sehen Sie, dass der Assistent zum Erstellen des Entity Data Models den absoluten Pfad zur Datenbankdatei Bestellverwaltung.db angegeben hat. Das geht solange gut, wie Sie die Anwendung auf dem Entwicklungsrechner debuggen oder einsetzen und die Datenbank sich an Ort und Stelle befindet.
Wenn Sie jedoch die Anwendung auf einen anderen Rechner verschieben, ist die Wahrscheinlichkeit hoch, dass die Datenbankdatei unter diesem Pfad nicht mehr zu erreichen ist. Ich selbst programmiere beispielsweise auf zwei verschiedenen Rechnern, wobei die Dateien per DropBox jeweils auf den aktuellsten Stand gebracht werden. Und sobald das Projekt samt Datenbankdatei auf dem einen Rechner nicht auf dem gleichen Pfad wie auf dem anderen Rechner liegt, findet eines der beiden Projekte die Datenbankdatei nicht mehr.
Relativ statt absolut
In diesem Fall ist die erste Maßnahme, den Pfad aus der Angabe der Quelldatenbank zu entfernen und nur noch den Dateinamen anzugeben. Das sieht dann in der Datei App.config wie folgt aus:
<configuration> ... <connectionStrings> <add name="BestellverwaltungEntities" connectionString="...;provider=System.Data.SQLite.EF6;provider connection string="data source=Bestellverwaltung.db"" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>
Dies bedeutet nun nichts anderes, als dass die Datenbankdatei nun immer dann erreichbar ist, wenn sich diese im gleichen Verzeichnis wie die .exe-Datei des Projekts befindet.
Mehrbenutzer-Szenario
Das wird in einem Mehrbenutzer-Szenario natürlich nicht mehr funktionieren, denn schon wenn die Anwendung auf zwei Rechnern installiert ist, müsste man auf einem Rechner den absoluten Pfad zu der zu nutzenden Datenbankdatei hinterlegen.
Wir benötigen also einen Mechanismus, der beim Start der Anwendung ausgelöst wird und prüft, ob die zu verwendende Datenbankdatei verfügbar ist. Wenn dies nicht der Fall ist, soll ein Dialog erscheinen, mit dem der Benutzer die Datenbankdatei auswählen soll. Diese Änderung sollte dann optimalerweise irgendwo in den Einstellungen der Datenbank gespeichert und von nun an beim Start abgerufen werden können. Wir beginnen jedoch mit der Prüfung, ob die Datenbankdatei überhaupt an Ort und Stelle ist. Dies erledigen wir beim Start der Anwendung, und zwar beim Aufruf des Hauptfensters.
Beispielkonstellation
Wir erstellen im Fenster MainWindow eine minimale Konfiguration, um die Kunden aus der Datenbank Bestellverwaltung.db in einem DataGrid anzuzeigen. Dazu fügen Sie MainWindow.xaml folgenden Code hinzu: