Avalonia 使用EFCore調用SQLite實現Singleton全局註冊

来源:https://www.cnblogs.com/raok/archive/2023/07/20/17569684.html
-Advertisement-
Play Games

# Avalonia 使用EFCore調用SQLite實現Singleton全局註冊 ![image-20230720204001797](https://www.raokun.top/upload/2023/07/image-20230720204001797.png) 本篇博客是我的開源項目[T ...


Avalonia 使用EFCore調用SQLite實現Singleton全局註冊

image-20230720204001797

本篇博客是我的開源項目TerraMours.Chat.Ava的更新的記錄分享,本次更新使用EntityFrameWork Core調用SQLite,實現數據的本地化和查詢的優化,刪除了dbpross類(直接調用SQLite的操作類)。大大提高了代碼的簡潔度和易讀性。通過全局註冊的ChatDbcontext對象,是操作資料庫變的非常方便。對項目感興趣的同學可以到github上搜索TerraMours.Chat.Ava。希望通過該項目瞭解和學習Avalonia開發的朋友可以在我的github上拉取代碼,同時希望大家多多點點star。

https://github.com/raokun/TerraMours.Chat.Ava

項目的基礎通用功能和業務代碼開發在之前博客中介紹過了,想瞭解的同學跳轉學習:

基於Avalonia 11.0.0+ReactiveUI 的跨平臺項目開發1-通用框架

基於Avalonia 11.0.0+ReactiveUI 的跨平臺項目開發2-功能開發

瞭解Avalonia創建模板項目-基礎可跳轉:

創建Avalonia 模板項目-基礎

本次我主要分享的內容是項目中使用EFCore調用SQLite的實現。

1.安裝nuget包

<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-preview.6.23329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.0-preview.6.23329.4">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>

2.創建一個繼承自 DbContext 的類

創建ChatDbcontext繼承自 DbContext 的類,併在構造函數中將連接字元串傳遞給 DbContextOptions 對象。

image-20230720201859049

代碼如下:

public class ChatDbcontext :DbContext{
    public DbSet<ChatMessage> ChatMessages { get; set; }
    public DbSet<ChatList> ChatLists { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite($"Data Source={AppSettings.Instance.DbPath}"); // 這裡是您的 SQLite 連接字元串
    protected override void OnModelCreating(ModelBuilder modelBuilder) {
        // 添加實體配置
        modelBuilder.Entity<ChatMessage>().HasKey(e => e.ChatRecordId);
        modelBuilder.Entity<ChatList>().HasKey(e => e.Id);

        base.OnModelCreating(modelBuilder);
    }

    //切換資料庫連接
    public void ChangeConnection(string connectionString) {
        // 修改資料庫連接字元串,並重新配置 DbContext
        Database.GetDbConnection().ConnectionString = connectionString;
        ChangeTracker.AutoDetectChangesEnabled = false;
        ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
        ChangeTracker.AutoDetectChangesEnabled = true;
    }
    /// <summary>
    /// 檢查表是否存在
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public bool CheckIfTableExists<T>() where T : class {
        var tableExists = this.Model.FindEntityType(typeof(T)) != null;

        return tableExists;
    }

}

其中包括:

  1. OnConfiguring 根據配置文件中的資料庫地址設置資料庫連接
  2. OnModelCreating 中設置實體類的主鍵
  3. ChangeConnection 方法實現切換資料庫連接
  4. CheckIfTableExists 方法 檢查指定的表是否存在

3.DbContext 註冊為全局服務

1.創建一個靜態欄位

VMLocator類中,創建一個靜態欄位來保存 DbContext 的實例

image-20230720202243816

代碼如下:

private static ChatDbcontext _chatDbcontext;
public static ChatDbcontext ChatDbcontext {
    get => (_chatDbcontext ??= new ChatDbcontext());
    set => _chatDbcontext = value;
}

2.創建ChatProcess資料庫操作類

image-20230720202418912

代碼如下:

 /// <summary>
/// 創建並初始化資料庫
/// </summary>
public void CreateDatabase() {
    using (var context = new ChatDbcontext()) {
        context.Database.Migrate();
        VMLocator.ChatDbcontext = context;
    }
}

/// <summary>
/// 判斷載入的資料庫表是否完整
/// </summary>
public async Task<bool> CheckTableExists(string selectedFilePath) {
    VMLocator.ChatDbcontext.ChangeConnection(selectedFilePath);
    return (VMLocator.ChatDbcontext.CheckIfTableExists<ChatMessage>() && VMLocator.ChatDbcontext.CheckIfTableExists<ChatList>());
}

其中:

  1. CreateDatabase方法的作用是初始化資料庫,如果在指定的資料庫文件地址中不存在文件,則在訪問資料庫時,SQLite 資料庫引擎會嘗試創建一個新的資料庫文件。這意味著,如果指定的資料庫文件地址沒有文件,EF Core 與 SQLite 的集成會自動創建一個新的資料庫文件。
  2. CheckTableExists 方法判斷載入的資料庫表是否完整

3.ChatDbcontext初始化和賦值

image-20230720202912536

ChatDbcontext初始化和賦值在MainWindow_Loaded方法中,在首頁載入時,判斷配置中的資料庫文件地址。並載入資料庫。

4.DbContext的使用

如何在程式中使用DbContext來查詢資料庫是重點,下麵是一些應用的場景:

image-20230720203148681

代碼如下:

//數據載入
            VMLocator.DataGridViewModel.ChatList=VMLocator.ChatDbcontext.ChatLists.ToObservableCollection();
            VMLocator.ChatViewModel.ChatHistory = VMLocator.ChatDbcontext.ChatMessages.ToObservableCollection();

這裡查詢資料庫的記錄賦值給DataGridViewModelChatViewModel,實現資料庫的數據的載入。

簡簡單單的兩行代碼,完成了會話列表和聊天記錄的數據載入。

image-20230720204001797

ToObservableCollection擴展

我們需要把資料庫查詢的數據轉換成ObservableCollection的集合做Binding,我們寫一個EF的擴展方法來實現這個轉換。

image-20230720204450457

代碼如下:

/// <summary>
/// 擴展方法
/// </summary>
public static class ObservableCollectionExtensions {
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source) {
        return new ObservableCollection<T>(source);
    }
}

更多的使用方法可以在代碼中查看TerraMours.Chat.Ava

5.生成數據遷移文件

image-20230720164423510

執行Add-Migration 命令

Add-Migration Init0720

由於我們在CreateDatabase代碼里實行了資料庫的更新,所以我們在這裡不需要執行Update-Database 命令

image-20230720204851101

值得註意的是,我們在修改過欄位後,一定要執行Add-Migration 命令生成數據遷移文件,這是資料庫初始化和更新的基礎

6.總結

通過EF core 等ORM框架操作資料庫為我們開發項目時提供了便捷。在不追求極限的速度的前提下,使用EntityFrameWork來做查詢真的很方便。

通過ChatDbcontext來操作資料庫,讓開發變的簡單。希望看完後能給大家帶來幫助。

目前程式還沒有完全開發完成。後續的開發我會及時跟進。閱讀如遇樣式問題,請前往個人博客瀏覽:https://www.raokun.top

目前web端ChatGPT:https://ai.terramours.site

當前開源項目地址:https://github.com/raokun/TerraMours.Chat.Ava


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概念 **1、public和private** 兩個都是訪問許可權修飾符,用於控制外界對類內部成員的訪問。 * public:表明對象成員是完全共有的,外界可以隨意訪問。用public修飾的數據成員、成員函數是對所有用戶開放的,所有用戶都可以直接進行調用。 * private:表明對象成員是完全私 ...
  • 大數據、elasticsearch、實時搜索、search_as_you_type、Completion Suggester、查詢優化、首碼匹配、中綴匹配 ...
  • # 通用返回類Result > 前言:Java項目搭建時,常常需要去封裝一個通用型的Result工具類,下麵就是我自己封裝的常用的返回類,可以直接使用。(*有部分Swagger註解,使用時可忽略*) ### 第一步、創建ReusltUtils工具類 ```java package com.code. ...
  • 來源:toutiao.com/a6775476659416990212 ## **前言** 在SpringBoot框架中,我們使用最多的是Tomcat,這是SpringBoot預設的容器技術,而且是內嵌式的Tomcat。 同時,SpringBoot也支持Undertow容器,我們可以很方便的用Und ...
  • ## 什麼是 gRPC? gRPC 是由 Google 開發的高性能、開源的 RPC(Remote Procedure Call)框架,用於在客戶端和伺服器之間進行通信。它基於 Protocol Buffers(protobuf)進行消息序列化和反序列化,支持多種通信協議,如 HTTP/2、TCP ...
  • # UDP網路通信編程 - **基本介紹** 1. 類DatagramSocket和DatagramPacket實現了基於UDP協議網路程式。 2. UDP數據報通過數據報套接字DatagramSocket發送和接收,系統不保證UDP數據報一定能夠安全送到目的地,也不能確定什麼時候可以抵達。 3. ...
  • 由於一些歷史原因,重裝系統成為Windows用戶解決疑難雜症的祖傳手藝。受此影響,給硬碟分區幾乎成為了一種執念,少則C、D兩個盤,誇張一點的5~6個盤的也不是沒有。 > PS:macOS和Linux一直都不鼓勵給磁碟分區,雖然不禁止但也不提倡。隨著雲技術和寬頻的提升,越來越多的人更喜歡把自己認為比較 ...
  • 眾所周知,我們是訪問不通OpenAI官方服務的,但是我們可以自己通過代理或者使用第三方代理訪問介面 現在新出台的規定禁止使用境外的AI大模型介面對境內客戶使用,所以我們需要使用國內的大模型介面 國內的效果真的很差,現在如果想合規的使用GPT大模型,可以使用微軟Azure的OpenAI服務,畢竟微軟在 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...