SQLite i Entity Framework w Visual Studio Express 2013
W ostatniej wersji Visual Studio 2013, wsparcie dla SQL Server Compact (.sdf) zostało porzucone. Jakie są alternatywy dla lokalnej bazy danych? SQLite jest lekkim silnikiem bazy danych, który można wykorzystać do małych projektów, nie wymagających dedykowanej bazy danych.
Generowanie pliku EDMX
Poniższa instrukcja jest kompatybilna z Visual Studio Express 2013 dla .NET 4.0 i dla platformy x86.
W wersjach Express, nie można instalować zewnętrznych wtyczek. Testowałem paczkę SQLite with budle dla edycji Professional, ale bez pozytywnego rezultatu (ciągle brak providera na liście, podczas generowania modelu EDMX). Skutecznym obejściem tych problemów jest wygenerowanie modelu na podstawie narzędzia edmgen oraz edmgen2. Zaletą tego podejścia jest to, że możemy wykorzystać model w wersjach Express.
Edmgen – tworzenie modelu bazy danych EDMX
Dzięki edmgen można utworzyć niezbędne pliki .ssdl .msl and .csdl. Edmgen2.exe łączy je w plik wynikowy .edmx.
- Po pierwsze, musisz pobrać paczkę precompiled statically-linked binaries z http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki. Jest to istotne, ponieważ ta paczka zawiera wymagany plik SQLite.Interop.dll. Jeśli używasz 64 bitowego systemy, pobierz wersję x64.
- Wypakuj pliki i skopiuj tam edmgen.exe and edmgen2.exe
- Należy utworzyć plik konfiguracyjny dla edmgen, aby mógł wykorzystać dostawcę SQLite. Utwórz edmgen.exe.config z następującą zawartością:
[code lang=”xml”]
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
</DbProviderFactories>
</system.data>
</configuration>
[/code] -
Utwórzmy skrypt gen.cmd, który posłuży do wygenerowania modelu:
[code lang=”shell”]
edmgen.exe /mode:fullgeneration /c:"Data Source=<PATH_TO_SQLITE>" /provider:System.Data.SQLite /entitycontainer:<ENTITY_NAME> /project:<ENTITY_NAME> /language:CSharp
edmgen2.exe /ToEdmx <ENTITY_NAME>.csdl <ENTITY_NAME>.msl <ENTITY_NAME>.ssdl
[/code]
Uzupełnij pola (ścieżka do bazy danych, oraz nazwę projektu). Uruchom skrypt. Jeśli otrzymasz wyjątek BadImageFormatException to znaczy, że SQLite.Interop.dll jest w złej wersji (x64 lub x86) .
Visual Studio
- Utwórz projekt dla .NET 4.0 i platformy x86.
- Zainstaluj SQLite przez Nuget
- Dodaj wygenerowany wcześniej model
- Dodaj brakujÄ…ce referencje. W moim przypadku – System.Data.Entity
- Dodaj bazÄ™ danych do projektu
- Zaktualizuj app.config
[code lang=”XML”]
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!– For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 –>
</configSections>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
</configuration>
[/code] - Connection string
[code lang=”csharp”]
var conn = new EntityConnectionStringBuilder();
conn.ProviderConnectionString = "data source=<PATH_TO_DATABASE>";
conn.Provider = "System.Data.SQLite";
conn.Metadata = "res://*/";
[/code] - Po zbudowaniu projektu, skopiuj odpowiedni plik SQLite.Interop.dll
Problemy
VS ciągle pokazuje błąd w pliku EDMX (dostawca SQLite nie znaleziony). Nie przeszkadza to jednak w kompilacji programu. Operacje I/O z wykorzystaniem Entity Framework działają bezbłędnie.
Podsumowanie
SQL Server Compact (.sdf) nie jest już w pełni wspierane od wersji 2013 (jednak starsze projektu kompilują się bezproblemowo). Jakie są alternatywy? Można wykorzystać LocalDB, ale to wymaga instalacji dodatkowego oprogramowania. Myślę, że SQLite jest najlepszym wyborem, ale konfiguracja z Entity Framework przysparza wiele problemów.
Strona Internetowa
Potrzebujesz Å‚adnej strony internetowej? Zobacz demo na: tej stronie
A jak ustawić w app.config ścieżkę względną do bazy w ConnectionStringu?
Prawdopodobnie manualnie w kodzie musiałbyś podmienić ścieżkę na początku programu. Zobacz na Stackoverflow.
już znalazłem tylko zapomniałem podać rozwiązanie.
Wystarczy podmienić ścieżkę np
d:\projekt\bin\debug\mojaBaza.db
na
|DataDirectory|mojaBaza.db
lub poprostu wpisać
mojaBaza.db
należy tylko pamiÄ™tać że jeżeli Å›cieżka podana jest miÄ™dzy “"” to te znaki muszÄ… zostać, a przynajmniej u mnie tak byÅ‚o