從本篇文章開始我們從頭開始學習如何建立一個圖書租賃系統。
在本篇文章中我們先來學習建立一個書籍資訊的實體類,並且通過實體框架(EF Core)使用這個書籍實體類來處理書籍資訊資料。
EF Core是一個輕量化、可延伸、開源和跨平臺的物件關係對映(ORM)框架,它簡化了編寫資料庫存取的程式碼。EF Core支援多個資料庫引擎。
EF Core使用模型執行資料存取。模型是由實體類和表示資料庫對談的上下文物件構成。上下文物件允許查詢並儲存資料。
建立的實體類被稱為POCO類(「普通的CLR物件」)因為他們沒有在EF Core中有任何依賴。它們定義儲存在資料庫中的資料的屬性。
一、新增一個實體類
2. 在Visual Studio 2022的解決方案資源管理器中,滑鼠右鍵單擊「Models」資料夾。在彈出選單中選擇,新增-->類。類名為Book。如下圖。
3.在book類中的程式碼檔案中新增以下屬性 。
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; namespace BlazorAppDemo.Models { public class Book { private string name = String.Empty; private string author=String.Empty; [Key] public int ID { get; set; } public string Name { get => name; set => name = value; } public DateTime ReleaseDate { get; set; } public string Author { get => author; set => author = value; } public decimal Price { get; set; } /// <summary> /// 圖書型別編號 /// </summary> public string Type { get; set; } /// <summary> /// 頁碼 /// </summary> public int TotalPages { get; set; } /// <summary> /// 庫存數量 /// </summary> public int StockQty { get; set; } /// <summary> /// 現存量 /// </summary> public int Qty { get; set; } } }
其中ID欄位必須是資料庫中表Book的主鍵。
二、新增資料庫上下文類
在Visual Studio 2022的解決方案資源管理器中,滑鼠右鍵單擊「Models」資料夾。在彈出選單中選擇,新增-->類。類名為BookContext.cs類,繼承自DbContext,操作方式如上第2點中的圖所示,程式碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; namespace BlazorAppDemo.Models { public class BookContext:DbContext { public BookContext(DbContextOptions<BookContext> options) : base(options) { } public DbSet<Book> Book { get; set; } } }
三、新增資料庫連線字串
在Visual Studio 2022中的資源管理器中找到appsettings.json檔案,用滑鼠雙擊開啟,在檔案中新增一個連線字串,程式碼如下。
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "ConnectionStrings": { "BookContext": "Server=.;Database=Books;Trusted_Connection=True;MultipleActiveResultSets=true" }, "AllowedHosts": "*" }
四、註冊資料庫上下文
1.程式碼寫到這時,我們發現剛才寫的程式碼,特別是BookContext.cs中的程式碼,如下圖紅框處,出現了波浪線。這表明我們的依賴項中沒有EntityFrameCore相關的元件。
2.在Visual Studio 2022的資源管理器中,在「依賴項」上點選滑鼠右鍵,在彈出選單中選擇「管理Nuget程式包」。如下圖。
3.在瀏覽介面的搜尋方塊中輸入以下四個包的名稱。如下圖。找到之後分別安裝好。
4. 在Visual Studio 2022中的資源管理器中,滑鼠右鍵單擊「Data資料夾。在彈出選單中選擇,新增-->類。類名為ConfigHelper。這個類用來讀取appsettings.json檔案中的設定資訊。程式碼如下。
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Json; namespace BlazorAppDemo.Data { public class ConfigHelper { public static IConfiguration Configuration { get; set; } static ConfigHelper () { //ReloadOnChange = true 當appsettings.json被修改時重新載入 Configuration = new ConfigurationBuilder() .Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true }) .Build(); } } }
5. 在Visual Studio 2022中的資源管理器中找到Program.cs檔案,用滑鼠雙擊開啟,在Program.cs檔案的var app = builder.Build();這一行程式碼前面寫入依賴注入容器註冊資料庫上下文的程式碼,具體程式碼如下。
builder.Services.AddDbContextFactory<BookContext>(opt => opt.UseSqlServer(JsonHelper.Configuration["ConnectionStrings:BookContext"]));
6. 最後,在Visual Studio 2017中的選單中選擇「生成-->生成解決方案」對專案進行編譯,以驗證自己寫的程式碼沒有任何錯誤同。
五、EFCore支援的資料庫
每個DbContext
範例都必須設定為使用一個且僅一個資料庫提供程式。(DbContext
子型別的不同範例可用於不同的資料庫提供程式,但單個範例只能使用一個。)使用特定的 Use*
" 呼叫設定資料庫提供程式。例如,上面程式碼中我們使用SQL Server資料庫提供程式。
builder.Services.AddDbContextFactory<BookContext>(opt => opt.UseSqlServer(JsonHelper.Configuration["ConnectionStrings:BookContext"]));
Use*
" 方法是由資料庫提供程式實現的擴充套件方法。 這意味著必須先安裝資料庫提供程式 NuGet 包,然後才能使用擴充套件方法。
EF Core 資料庫提供程式廣泛使用擴充套件方法。下表包含常見資料庫提供程式的範例:
|
|
|
|||
SQL Server 或 Azure SQL |
.UseSqlServer(connectionString) |
Microsoft.EntityFrameworkCore.SqlServer |
|||
Azure Cosmos DB |
.UseCosmos(connectionString, databaseName) |
Microsoft.EntityFrameworkCore.Cosmos |
|||
SQLite |
.UseSqlite(connectionString) |
Microsoft.EntityFrameworkCore.Sqlite |
|||
EF Core 記憶體中資料庫 |
.UseInMemoryDatabase(databaseName) |
Microsoft.EntityFrameworkCore.InMemory |
|||
PostgreSQL* |
.UseNpgsql(connectionString) |
Npgsql.EntityFrameworkCore.PostgreSQL |
|||
MySQL/MariaDB* |
.UseMySql((connectionString) |
Pomelo.EntityFrameworkCore.MySql |
|||
Oracle* |
.UseOracle(connectionString) |
Oracle.EntityFrameworkCore |