【C#】使用EF訪問Sqlite資料庫
1. 先上Nuget下載對應的包
如圖,搜尋System.Data.SQLite下載安裝即可,下載完之後帶上依賴一共有這麼幾個:
- EntityFramework
- System.Data.SQLite
- System.Data.SQLite.Core
- System.Data.SQLite.EF6
- System.Data.SQLite.Linq
安裝完成後,會新增App.config檔案(如果沒有的話),裡面添加了一些provider的配置。
2. 先看下DB First模式
如果你用的是VS2017的話,很不幸無法通過“ADO.NET實體資料模型”來生成edmx檔案。如果用VS2015及之前版本的話可以去官網下載一個外掛,安裝之後就可以用了。這裡以VS2017為例:
1. 首先,在App.config中配置資料庫連線字串:
<connectionStrings>
<add name="SqliteTest" connectionString="Data Source=E:\retail.db" providerName="System.Data.SQLite.EF6" />
</connectionStrings>
2.然後就可以 編寫資料庫上下文和實體了,然後就可以用了
public class RetailContext : DbContext
{
public RetailContext(): base("SqliteTest"){}
public DbSet<Thumbnail> Thumbnails { set; get; }
}
public class Thumbnail
{
public Int64 Id { get; set; }
[Required]
[Unique]
public string OrginFilePath { get; set; }
[Required]
public string ThumbnailPath { get; set; }
[Required]
public DateTime LastUpdateTime { get; set; }
}
不過在執行過程中你可能會遇到這個錯誤SQLite error of “Unable to find the requested .Net Framework Data Provider.
解決方法就是在App.config的providers
中新增以下節點
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
完整的如下:
<providers>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<!-- 1. Solves SQLite error of "Unable to find the requested .Net Framework Data Provider."-->
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
從上面的程式碼可以看到資料庫的路徑是寫死的不能改變,這樣就很不靈活。我喜歡可以動態連線的資料庫,所以再次修改:
我們知道DbContext
這個類有幾個建構函式,一個是接收string
型別的connectionString
,一般都用的是這個。還有一個建構函式是接收一個DbConnection
型別引數和bool
型別的引數。這個建構函式就可以實現我們的要求:
- 首先,構造一個
DbConnection
類:
DbConnection sqliteCon = SQLiteProviderFactory.Instance.CreateConnection();
- 然後,給這個物件設定
ConnectionString
:
sqliteCon.ConnectionString = dbPath;
最後,把這個物件傳給
DbContext
即可。如下:
public class ThumbnailContext : DbContext
{
static string dbPath = $"Data Source=E:\\thumbnail.db";
public static ThumbnailContext Instance
{
get
{
DbConnection sqliteCon = SQLiteProviderFactory.Instance.CreateConnection();
sqliteCon.ConnectionString = dbPath;
return new ThumbnailContext(sqliteCon);
}
}
private ThumbnailContext(DbConnection con) : base(con, true) { }
public DbSet<Thumbnail> Thumbnails { get; set; }
}
3. CodeFirst模式
Sqlite預設不支援CodeFirst模式,如果使用者因為某些操作刪除了我們的db檔案,此時我們的程式就不能正常工作了,是不是有點尷尬?不過還是有解決辦法的,在Nuget裡搜尋SQLite.CodeFirst
安裝即可。
然後重寫DbContext
的OnModelCreating
方法。這裡是修改後的資料庫上下文:
public class ThumbnailContext : DbContext
{
static string dbPath = $"Data Source={PathManager.AppDataTempThumbnail}\\thumbnail.db";
public static ThumbnailContext Instance
{
get
{
DbConnection sqliteCon = SQLiteProviderFactory.Instance.CreateConnection();
sqliteCon.ConnectionString = dbPath;
return new ThumbnailContext(sqliteCon);
}
}
private ThumbnailContext(DbConnection con) : base(con, true) { }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//如果不存在資料庫,則建立
Database.SetInitializer(new SqliteCreateDatabaseIfNotExists<ThumbnailContext>(modelBuilder));
}
public DbSet<Thumbnail> Thumbnails { get; set; }
}
4.一些優化
在使用過程中你可能會察覺到,每當第一次訪問資料庫(查詢、插入等)時總是會慢一點,可能有1秒的時間資料庫才會做出響應,然後接下再操作就很快。
這是因為當你第一次訪問資料庫時,EF需要在記憶體中建立實體與資料庫表的對映關係,這個操作需要點時間。所以在你的程式一啟動的時候就要把關係給對映好。
這裡以上面的ThumbnailContext
為例,首先new一個物件,假設為dbContext
。然後在你整個應用程式的入口點呼叫下述程式碼:
public void Init()
{
//Pre-Generated Mapping Views
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
mappingCollection.GenerateViews(new List<EdmSchemaError>());
}
後記:通過EF來訪問Sqlite資料庫,我也使用了有一段時間了,但是有時候會出現幾個莫名奇妙的問題,而且還不太好定位,不知道是不是EF和Sqlite不太相容的問題。現在嘗試改為用ADO.NET來訪問,於是就有了接下來的這篇文章:【C#】使用ADO.NET訪問Sqlite資料庫,SqliteHelper幫助類。
參考連結:
相關推薦
【C#】使用EF訪問Sqlite資料庫
1. 先上Nuget下載對應的包 如圖,搜尋System.Data.SQLite下載安裝即可,下載完之後帶上依賴一共有這麼幾個: EntityFramework System.Data.SQLite System.Data.SQLite.C
【C#】EF學習<二> DbFirst (先建立資料庫,表及其關聯關係)
工程壓縮檔案放到百度雲盤---20181019001資料夾 1. 建立表的指令碼 create table Teacher ( TID char(12) primary key, Tname char(6) not null ) create table
【C#】如何在查詢資料庫表並顯示到DataGridV中的進度條動態顯示?
在實際應用中 ,如果要查詢的資料十分多,需要新增進度條顯示,告知使用者程式沒有假死,在程式中新增進度條視窗,在點選查詢按鈕時,開啟此進度條視窗,委託執行緒新增進度條的值,先走一步,表示程式沒有死,查詢以後,走49步,走一半,然後,在後面的顯示到DataGridView時,在
【C#】使用ADO.NET訪問Sqlite資料庫,SqliteHelper幫助類
這個就比較簡單了,用過sqlserver的人都知道訪問資料庫的時候一般都會有個SqlHelper的幫助類,這裡就依葫蘆畫瓢寫了個SqliteHelper,很簡單: using System; using System.Collections.Generic
【C#】C#訪問和操作MYSQL資料庫
這裡介紹下比較簡單的方式,引用MySql.Data.dll然後新增一個MySqlHelper類來對MySql資料庫進行訪問和操作。 1.將MySql.Data.dll引用到你的專案中 新增引用後在你的資料庫操作類(如MySqlHelper.cs)中新增引用宣告
【自動化測試】Python 訪問 mysql資料庫
一、準備工作 1、確保Python環境已安裝mysql,py3.*版本:pip install PyMySQL PyMySQL是在Python3.x中用於連線MySQL伺服器的一個庫。 2、已經建立了資料庫testDB,相關表table,以及表字段 3、資料庫連線
【c#】連線資料庫相關知識
知識回顧 1、儲存過程: 是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,儲存在資料庫中,經過第一次編譯後再次呼叫不需要再次編譯,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程
【C#】訪問泛型中的List列表資料
光看標題的確不好說明問題,下面描述一下問題場景: 已知後端自定義的返回的Json資料結構如下: response: { "message": "返回成功", "result": [ { "na
循序漸進學.Net Core Web Api開發系列【8】:訪問資料庫(基本功能)
系列目錄 一、概述 本篇討論如何連線資料庫,包括連線SQL Server 和 連線MySQL,然後做一些基本的資料操作。 二、連線SQL Server 首先通過NuGet新增相關的包: 新建一個實體類: public class Product {
【Android Sqlite】萌動的sqlite資料庫,簡單實現:使用者增刪改查
sqlite資料的使用很常見呢,我們簡單學習一下app的登入、註冊、修改、刪除使用者吧! 下面就寫一個萌動的app註冊登入吧! 主頁面: 還有2個圖片按鈕(雖然不是很好看,但是將就吧→。→) EditView輸入框的監聽事件,2張圖片的切換 (為了找22,33的圖片
【C#】通過遍歷IFrame訪問頁面元素
最近在做一個小專案,期間需要用到C#去操作IE頁面中的元素,實現自動填寫表單並且提交的功能,想這網上關於這方面的東西肯定很多,於是開始在網上找資料。 1.首先新增必須的兩個控制元件的引用 Microsoft Internet Controls Microsoft HTM
【C#】32. 使用EF(EntityFramework)連線Mysql,MVC開發
距離上一次寫部落格已經過去了很久。。。。 這次主要來說說MVC開發,主要是講Mysql如何與EF進行銜接,製作資料庫網頁顯示的。 我使的資料庫是用的Mysql 5.5,裡面是一些期貨合約的資料。我的想法是將這些資料以網頁的形式呈現出來,這樣我們內部就不需要裝資料庫UI(Fr
【C/C++】檔案讀取與資料庫讀取速率對比
由於開發物流資訊網,關於這個問題也是最近才想到的,就是到底讀檔案更快還是讀資料庫更快,能快多少,書生也搜尋過,沒見有網友就這個問題答覆過,也可能是太簡單的緣故,我們本文還是來實測一下,由於時間關係,VC還沒裝,書生先用PHP測試了一下,下次有時間在C/C++上補充測試到本
C++Builder下如何用FireDAC控制元件訪問SQLite資料庫
(同一個世界,同一個夢想,交流學習C++Builder XE10,傳承c++builder的魅力!歡迎各地朋友加入我的QQ群484979943,進群密碼“BCB”,同時也請將該群號廣為宣傳,希望能夠廣集各方高手,共同進步。) 軟體及版本:C++Builder 10.2.2
【C++】容器介面卡實現佇列Queue的各種功能(入隊、出隊、判空、大小、訪問所有元素等)
介面卡:將一個通用的容器轉換為另外的容器,所謂的容器,指的是存放資料的器具,像我們知道的順序表和連結串列都是容器Container。舉個例子解釋一下吧,我們的電壓都是220v,而像充電線就起到轉換到合適的電壓的作用。而這裡,我們的主角就是將通用的連結串列結構轉換為來實現佇列Q
【C】字符串常量和字符數組
gcc pre class fun 後者 一段 put light cmp 此次博客是轉載某位博主的文章,不過現在找不到了,所以先聲明一下。 先貼一段代碼: #include <stdio.h> int main(int argc, const char**
【C#】監測文件改變類
tco private clas 目錄修改 obj directory 設置 行修改 config using System.IO;//首先實例化一個對象 FileSystemWatcher watcher = new FileSystemWatcher(); //
【C#】報表制作<機房重構>
接下來 機房 工具 學習 test trac fcm 報表 感覺 前言 和VB須要引用其它報表軟件不同,VS自帶報表設計的功能,初次嘗試。就感受到了它的強大之處。 報表制作 話不多說。直接報表的制作過程。 1、首先,我們要先制作一個報表的
【C#】單例模式<機房重構>
機房 .sh 不能 是否 gist 應用 調用方法 單例模式 sender 前言 在機房重構之前。我們學習了設計模式。在這次重構中,我們的任務就是將這些模式,加入到機房的重構中去。如今先來解決一個最簡單的問題——窗口的超生。 假設不加以限
【C#】Color顏色對照表
pac eee lower fda flow dig val rim cee Color.AliceBlue 240,248,255 Color.LightSalmon 255,160,122 Color.