EF Core連線PostgreSQL資料庫

mingupupup發表於2024-08-07

PostgreSQL資料庫介紹

PostgreSQL是一個功能強大的開源物件關係型資料庫管理系統(RDBMS)。最初於1986年在加州大學伯克利分校的POSTGRES專案中誕生,PostgreSQL以其穩定性、靈活性和擴充套件性而著稱。它支援豐富的資料型別、複雜的查詢、事務完整性、多版本併發控制(MVCC)、儲存過程等高階功能。

PostgreSQL完全遵循SQL標準,支援ACID屬性(原子性、一致性、隔離性、永續性),適用於高併發和資料量大的應用場景。此外,它具有廣泛的可擴充套件性,允許使用者定義自己的資料型別、索引方法、函式、運算子等。PostgreSQL的強大社群不斷提供支援和擴充套件,使其在不斷髮展的資料庫技術中保持競爭力。被廣泛應用於資料分析、金融服務、Web開發等領域。

官網地址:https://www.postgresql.org

GitHub地址:https://github.com/postgres/postgres

image-20240807140547880

PostgreSQL:The World's Most Advanced Open Source Relational Database.

PosegreSQL:世界上最先進的開源關係型資料庫。

Entity Framework Core介紹

EF Core是專為.NET設計的現代化物件資料庫對映器。它支援LINQ查詢,變更跟蹤,更新以及模式遷移。EF Core支援與SQL Server,Azure SQL資料庫,SQLite,Azure Cosmos DB,MySQL,PostgreSQL以及透過提供程式外掛介面的整合其他資料庫。

透過EF Core,開發者能夠更高效地開發資料驅動的應用程式,適用於Web應用、桌面應用、微服務等多種應用場景。其不斷更新的版本和活躍的社群支援,使其成為.NET開發者首選的ORM框架之一。

GitHub地址:https://github.com/dotnet/efcore

文件地址:https://learn.microsoft.com/zh-cn/ef/core

image-20240807141748135

實踐

IDE:Visual Studio 2022

.NET版本:.NET 8

新建一個Web Api專案。

本次實踐需要用到3個包:

image-20240807142146162

image-20240807142204223

image-20240807142227059

第一個就是EF Core。

第二個Microsoft.EntityFrameworkCore.Tools 是一個為 Entity Framework Core 提供命令列工具支援的 NuGet 包。這個工具包主要用於資料庫遷移的建立、更新和管理,生成資料庫上下文類和實體類等。透過使用該工具,開發者可以從命令列或包管理器控制檯執行操作,如建立新遷移、應用遷移、生成資料庫指令碼等。這有助於在開發過程中保持資料庫模式與程式碼模型的一致性。

第三個Npgsql.EntityFrameworkCore.PostgreSQL 是一個用於將 Entity Framework Core(EF Core)與 PostgreSQL 資料庫結合使用的提供程式包。它為 EF Core 提供了對 PostgreSQL 資料庫的支援,使開發者能夠使用 EF Core 的功能來處理 PostgreSQL 資料庫中的資料。透過這個包,開發者可以使用 LINQ 查詢、自動遷移、模型驗證等 EF Core 特性,並且可以利用 PostgreSQL 特有的功能,如 JSONB 資料型別、全文搜尋、陣列等。

GitHub地址:https://github.com/npgsql/efcore.pg

首先在專案根目錄建立一個名為Data的資料夾,建立一個AppDbContext類。

image-20240807143755865

先大體上總覽一下這個類:

image-20240807143914379

首先它繼承自DbContext類。

在 Entity Framework Core(EF Core)中,DbContext 類是核心元件之一,負責管理與資料庫的所有互動。它充當應用程式與資料庫之間的橋樑,提供了查詢資料庫、儲存資料以及配置模型的功能。

主要功能和角色

  1. 資料訪問和查詢DbContext 提供了一組方法和屬性,允許開發者使用 LINQ 查詢資料庫。透過訪問 DbSet<TEntity> 屬性,可以對特定實體型別執行查詢操作。
  2. 物件追蹤和變更檢測DbContext 追蹤從資料庫中檢索到的實體物件的狀態。當物件的狀態發生變化時(如被修改、新增或刪除),DbContext 負責記錄這些變化,並在呼叫 SaveChanges() 方法時,將這些變化應用到資料庫中。
  3. 事務管理DbContext 支援事務的管理,透過 SaveChanges() 方法確保資料庫操作的原子性,即所有的操作要麼全部成功,要麼全部回滾。
  4. 模型配置DbContext 允許透過覆蓋 OnModelCreating 方法來配置實體模型與資料庫表之間的對映關係。這包括設定主鍵、索引、外來鍵關係、約束等。
  5. 生命週期管理DbContext 是一個可配置的類,其生命週期管理可以根據需要進行配置。通常,它在請求或操作的範圍內被建立和釋放,以確保資料庫連線的有效管理。

還有一個型別為IConfiguration的屬性,它透過建構函式注入。IConfiguration 是一個介面,主要用於獲取應用程式的配置資料。它提供了一種標準化的方式來訪問應用程式的配置資訊,例如連線字串、應用設定、外部服務的金鑰等。IConfiguration 允許開發者從各種來源(如 JSON 檔案、環境變數、命令列引數等)讀取配置,並將這些配置統一對映到一個結構化的物件中。

在Web Api中,我們一般把一些配置寫在appsettings.json中。

image-20240807144847765

本示例的appsettings.json如下所示:

image-20240807145043754

儲存了PostgreSQL的連線字串。

在OnConfiguring方法中進行連線字串的配置。

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
     optionsBuilder.UseNpgsql(Configuration.GetConnectionString("SKApiDatabase"));
 }

現在新建一個Student類:

 public class Student
 {
     public int Id { get; set; }
     public string? Name { get; set; }
     public string? Home { get; set; }
 }

在AppDbContext類中新增Student表:

 public DbSet<Student> Students { get; set; }

我們使用的是Code First。"Code First" 是 Entity Framework(包括 Entity Framework Core)中一種開發模式,它的主要思想是透過定義應用程式的領域模型(通常使用類)來建立和管理資料庫架構。這種方法強調首先編寫程式碼來定義資料模型,而資料庫的表結構則是由這些資料模型自動生成和維護的。

  1. 領域模型的定義:在 Code First 模式中,開發者首先定義領域模型,即使用類和屬性來表示資料庫中的實體和關係。透過註解(資料註解屬性)或流暢的API(Fluent API),開發者可以指定資料庫表、列、主鍵、外來鍵、索引等資料庫結構資訊。
  2. 資料庫上下文類:定義一個繼承自 DbContext 的類,它包含了對實體的 DbSet<TEntity> 屬性。這些屬性對應資料庫中的表,DbContext 類還負責管理資料訪問和物件的生命週期。
  3. 遷移:EF Core 提供了遷移(Migration)工具,可以根據程式碼中的模型變更生成和應用資料庫更新指令碼。遷移可以幫助開發者將資料庫架構從一個版本升級到另一個版本,同時保留資料。
  4. 自動生成資料庫:在應用程式執行時,EF Core 可以根據定義的模型自動生成資料庫架構。如果資料庫已經存在,EF Core 可以檢查和應用遷移來更新資料庫。

優點

  1. 開發效率高:開發者可以專注於程式碼開發,而不需要直接編寫 SQL 指令碼來定義資料庫結構。
  2. 易於維護:模型的變化可以透過程式碼和遷移工具方便地同步到資料庫。
  3. 型別安全:程式碼和資料庫模型是緊密繫結的,減少了由於不匹配導致的錯誤。

缺點

  1. 對複雜資料庫的支援:對於已有的大型複雜資料庫,Code First 可能不太合適,特別是在處理特定的資料庫最佳化和配置時。
  2. 效能問題:自動生成的SQL可能沒有手工最佳化的SQL高效。

總的來說,Code First 模式是一種簡化開發和維護資料庫架構的有效方法,特別適合於從頭開始的新專案。

現在就需要用到Microsoft.EntityFrameworkCore.Tools了,開啟程式包管理器控制檯,輸入

Add-Migration "備註資訊"

image-20240807150340099

成功之後,會發現專案根目錄多了個Migrations資料夾:

image-20240807150425459

Migrations 資料夾用於存放由遷移工具生成的遷移檔案。這些檔案記錄了資料庫架構的變更歷史,使得開發者可以管理和應用這些變更,以保持資料庫與程式碼模型之間的一致性。具體來說,Migrations 資料夾及其內容的作用包括以下幾個方面:

  1. 跟蹤資料庫架構的變更: 每當開發者對領域模型(實體類)或資料庫上下文類進行修改(如新增新實體、修改屬性型別等)並生成遷移時,EF Core 會在 Migrations 資料夾中建立一個新的遷移檔案。這個檔案包含了描述資料庫如何從一個狀態變更到另一個狀態的指令。
  2. 生成和維護遷移指令碼: 遷移檔案中包含兩個主要部分:Up 方法和 Down 方法。Up 方法定義了應用遷移時執行的操作,例如建立表、新增列等。而 Down 方法則定義了撤銷這些變更的操作。透過這些方法,EF Core 可以生成適用於不同資料庫提供程式的 SQL 指令碼,以便在資料庫中執行相應的變更。
  3. 應用遷移到資料庫: 透過 Update-Database 命令或程式碼中的 context.Database.Migrate() 方法,EF Core 會依次應用 Migrations 資料夾中的遷移,更新資料庫架構。這有助於在開發、測試和生產環境中保持資料庫的一致性。
  4. 版本控制和協作: 遷移檔案是普通的程式碼檔案,可以納入版本控制系統(如 Git)。這使得團隊成員可以方便地跟蹤資料庫架構的變更,回顧和討論不同版本之間的差異。

開啟20240806093127_init類看看:

image-20240807150949302

就像上面第二點說的一樣,包含兩個主要部分:Up 方法和 Down 方法。Up 方法定義了應用遷移時執行的操作,

Down 方法則定義了撤銷這些變更的操作。

開啟程式包管理器控制檯,輸入

Update-Database

image-20240807151439774

現在開啟pg Admin:

image-20240807151510445

pgAdmin 是一個用於管理 PostgreSQL 資料庫的開源圖形化使用者介面工具。它提供了一個友好的介面,幫助使用者執行資料庫管理任務、編寫和執行SQL查詢、監控資料庫狀態等。pgAdmin 適用於各種平臺,包括 Windows、macOS 和 Linux。

發現我們的資料庫中成功生成了兩張表:

image-20240807151824560

一張是在AppDbContext類中定義的Students表,一張是自動生成的用於記錄遷移歷史的__EFMigrationsHistory表。

以上就成功在Web Api中使用EF Core連線到PostgreSQL資料庫了,接下來就可以開始愉快地CRUD了。

參考

1、Setup PostgreSQL in .NET with Entity Framework (youtube.com)

相關文章