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.

  1. 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.
  2. Wypakuj pliki i skopiuj tam edmgen.exe and edmgen2.exe
  3. 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]
  4. 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

  1. Utwórz projekt dla .NET 4.0 i platformy x86.
  2. Zainstaluj SQLite przez Nuget
  3. Dodaj wygenerowany wcześniej model
  4. Dodaj brakujące referencje. W moim przypadku – System.Data.Entity
  5. Dodaj bazę danych do projektu
  6. 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]
  7. 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]
  8. 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.


Podobne artykuły

Komentarze

3 odpowiedzi na “SQLite i Entity Framework w Visual Studio Express 2013”

  1. marcin009988 napisał(a):

    A jak ustawić w app.config ścieżkę względną do bazy w ConnectionStringu?

    • Tomasz Maciejewski Tomasz Maciejewski napisał(a):

      Prawdopodobnie manualnie w kodzie musiałbyś podmienić ścieżkę na początku programu. Zobacz na Stackoverflow.

    • marcin009988 napisał(a):

      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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *