1. 程式人生 > >【C#】使用EF訪問Sqlite資料庫

【C#】使用EF訪問Sqlite資料庫

1. 先上Nuget下載對應的包

這裡寫圖片描述
如圖,搜尋System.Data.SQLite下載安裝即可,下載完之後帶上依賴一共有這麼幾個:

  1. EntityFramework
  2. System.Data.SQLite
  3. System.Data.SQLite.Core
  4. System.Data.SQLite.EF6
  5. 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安裝即可。
這裡寫圖片描述
然後重寫DbContextOnModelCreating方法。這裡是修改後的資料庫上下文:

    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#報表制作&lt;機房重構&gt;

接下來 機房 工具 學習 test trac fcm 報表 感覺 前言 和VB須要引用其它報表軟件不同,VS自帶報表設計的功能,初次嘗試。就感受到了它的強大之處。 報表制作 話不多說。直接報表的制作過程。 1、首先,我們要先制作一個報表的

C#單例模式&lt;機房重構&gt;

機房 .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.