August 4, 2013

使用Entity Framework操作SQLite

最近支援開發一個使用SQLite的單機應用程式,並使用Entity Framework來加速data access layer開發,以下記錄在Visual Studio 2010 Professional中如何設定Entity Framework來操作SQLite。

安裝VS 2010所需設計元件

System.Data.SQLite Download Page下載於VS 2010開發時所需的元件安裝檔sqlite-netFx40-setup-bundle-x86-2010-1.0.87.0.exe安裝檔。安裝過程中需勾選Install the designer components for Visual Studio 2010



安裝Entity Framework

透過以下nuget指令安裝Entity Framework

Install-Package EntityFramework


安裝System.Data.SQLite

透過以下nuget指令安裝System.Data.SQLite

Install-Package System.Data.SQLite

安裝完後在References中會看到System.Data.SQLiteSystem.Data.SQLite.Linq,專案內會新增兩個資料夾x64和x86,兩個資料夾內各有一個名為SQLite.Interop.dll的檔案。


建立ADO.NET Entity Data Model

在專案中新增一個ADO.NET Entity Data Model項目




點選New Connection,將Data source選取為System.Data.SQLite Database File,Data provider為.NET Framework Data Provider for SQLite


點選New,建立一個SQLite資料庫,如果資料庫已存在則點選Browse找出資料庫存在路徑即可。



設定完成後,在專案中會新增一個*.edmx檔案。在Server Explorer中也可以連線到剛建立的SQLite資料庫,讓我們可以在VS上操作資料庫。在這裡先建立一個測試用的資料表Log和其兩個欄位分別為LogId及LoggedOn。



更新Entity Data Model (*.edmx),可以看到資料表Log已被放入Entity Data Model中


安裝EF 5.x DbContext Generator for C#擴充樣板

這個步驟不是必須,但如果希望Entity Framework產生的是POCO類別的話透過這個擴充樣板便可輕鬆完成。至Extension Manager (Tools-> Extension Manager)中搜尋poco,便可看到EF 5.x DbContext Generator for C#選項並進行安裝。


安裝完成後回到*.edmx,右鍵選取Add Code Generation Item,選擇EF 5.x DbContext Generator for C#並為樣板命名


按下Add後便會開始產生POCO類別,可以在專案下看到*.tt*.Context.tt兩個新增檔案。*.tt裡的Log.cs即是對應資料表Log產生的POCO類別。


測試程式

執行以下程式,便可將資料新增至SQLite資料庫中
using (DemoEntities context = new DemoEntities())
{
    context.Logs.Add(new Log { LogId = Guid.NewGuid(), LogedOn = DateTime.UtcNow });
    context.SaveChanges();
}



部署注意事項

將應用程式部署到測試機上,執行後出現The specified store provider cannot be found in the configuration, or is not valid.錯誤訊息。更細部的錯誤訊息為Unable to find the requested .Net Framework Data Provider.  It may not be installed.


加入以下設定至設定檔<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.87.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>
    </DbProviderFactories>
</system.data>

1.0.87.0是我所使用的System.Data.SQLite元件版本。