SQLite是一套SQL資料庫引擎,並不算一套資料庫。SQLite可以模擬出SQL資料庫的標準與Table, Trigger, View等,但它不像資料庫有獨立的Server Process監聽執行,儲存方式也只是針對一個Local Disk檔案進行存取,檔案格式沒有限定,副檔名可以任意命名,SQLite對開發人員可說是一個輕量型的資料儲存方式,當要開發一個小型輕量的APP時可以使用。SQLite著名的應用就是Android的內部資料庫。但這篇的重點是在於要如何使用Entity Framework Code First搭配SQLite。
首先在Local建立一個SQLite Database檔案,有兩種方式:
a. 直接產生(按右鍵新增檔案,在修改副檔名)
b. 使用資料庫管理系統產生
接著就可以使用資料庫管理系統開啟SQLite檔案進行Create Table...等操作(限量使用Navicat這套資料庫管理工具)。
好了,SQLite資料庫產生好了,再來要來使用EF來連SQLite。在下列範例中,限量使用ASP.NET MVC5專案引入EF6。
Step1.. 首先透過NuGet加入安裝SQLite相關套件。
搜尋SQLite,安裝最上面的套件(安裝上面第一個套件後會自動將下面兩個套件一起安裝)。
Step2. 加入EF6 Code First Model Code與DbContext Code。
UserInfo.cs
上述程式碼為一個使用者資訊的Model,利用UserInfoDbMapping的Class描述Model欄位與Db欄位的對應。
PTMContext.cs
上述程式碼為連接DB的EF6 Code,透過在Controller宣告PTMContext Instance可以對DB進行IO動作。
這樣你以為就結束了嗎? 當你程式執行到DB IO動作時就會馬上跑出以下錯誤。
這個原因是因為.Net找不到System.Data.SQLite的Entity Framework Provider,而System.Data.SQLite的Entity Framework Provider是在Web.config裡定義,在安裝SQLite相關套件時,NuGet會自動在Web.config裡加上SQLite Entity Framework Provider,但自動加上的config字串有一點問題,只要按照下面修改部分修改就可以執行了。
Web.config修改部分
上面修改部分主要是複製原本自動加的System.Data.SQLite.EF6 Provider,把名稱改為System.Data.SQLite,因為.Net會去找System.Data.SQLite的Provider而不是System.Data.SQLite.EF6。
上面限量的方法只是其中一種解決方式,網路上有其他解決方式,像修改connectionStrings裡的providerName與DbProviderFactories的System.Data.SQLite,限量是沒試過啦,總而言之,只要能順利連接就OK了。
首先在Local建立一個SQLite Database檔案,有兩種方式:
a. 直接產生(按右鍵新增檔案,在修改副檔名)
b. 使用資料庫管理系統產生
接著就可以使用資料庫管理系統開啟SQLite檔案進行Create Table...等操作(限量使用Navicat這套資料庫管理工具)。
好了,SQLite資料庫產生好了,再來要來使用EF來連SQLite。在下列範例中,限量使用ASP.NET MVC5專案引入EF6。
Step1.. 首先透過NuGet加入安裝SQLite相關套件。
搜尋SQLite,安裝最上面的套件(安裝上面第一個套件後會自動將下面兩個套件一起安裝)。
Step2. 加入EF6 Code First Model Code與DbContext Code。
UserInfo.cs
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Web;
namespace PTMWeb.Models
{
public partial class UserInfo
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Nickname { get; set; }
public string Account { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public string PhoneNum { get; set; }
}
public class UserInfoDBMapping : EntityTypeConfiguration<UserInfo>
{
public UserInfoDBMapping()
{
this.ToTable( "UserInfo" );
this.HasKey( m => m.Id ).Property( m => m.Id ).HasColumnName( "Id" );
this.Property( m => m.Name ).HasColumnName( "Name" );
this.Property( m => m.Nickname ).HasColumnName( "Nickname" );
this.Property( m => m.Account ).HasColumnName( "Account" );
this.Property( m => m.Password ).HasColumnName( "Password" );
this.Property( m => m.Email ).HasColumnName( "Email" );
this.Property( m => m.PhoneNum ).HasColumnName( "PhoneNum" );
}
}
}
上述程式碼為一個使用者資訊的Model,利用UserInfoDbMapping的Class描述Model欄位與Db欄位的對應。
PTMContext.cs
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace PTMWeb.Models
{
public class PTMContext : DbContext
{
public DbSet<UserInfo> Users { get; set; }
public PTMContext()
{
Database.SetInitializer<PTMContext>( null );
}
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Configurations.Add( new UserInfoDBMapping() );
}
}
}
上述程式碼為連接DB的EF6 Code,透過在Controller宣告PTMContext Instance可以對DB進行IO動作。
這樣你以為就結束了嗎? 當你程式執行到DB IO動作時就會馬上跑出以下錯誤。
這個原因是因為.Net找不到System.Data.SQLite的Entity Framework Provider,而System.Data.SQLite的Entity Framework Provider是在Web.config裡定義,在安裝SQLite相關套件時,NuGet會自動在Web.config裡加上SQLite Entity Framework Provider,但自動加上的config字串有一點問題,只要按照下面修改部分修改就可以執行了。
Web.config修改部分
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<!--增加下列-->
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<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" />
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".Net Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="PTMContext" connectionString="Data Source=|DataDirectory|PTMDB.db" providerName="System.Data.SQLite" />
</connectionStrings>
上面修改部分主要是複製原本自動加的System.Data.SQLite.EF6 Provider,把名稱改為System.Data.SQLite,因為.Net會去找System.Data.SQLite的Provider而不是System.Data.SQLite.EF6。
上面限量的方法只是其中一種解決方式,網路上有其他解決方式,像修改connectionStrings裡的providerName與DbProviderFactories的System.Data.SQLite,限量是沒試過啦,總而言之,只要能順利連接就OK了。






留言
張貼留言