學習ASP.NET Core Blazor編程系列三——實體
從本篇文章開始我們從頭開始學習如何創建一個圖書租賃系統。
在本篇文章中我們先來學習創建一個書籍資訊的實體類,並且通過實體框架(EF Core)使用這個書籍實體類來處理書籍資訊數據。
EF Core是一個輕量化、可擴展、開源和跨平台的對象關係映射(ORM)框架,它簡化了編寫資料庫訪問的程式碼。EF Core支援多個資料庫引擎。
EF Core使用模型執行數據訪問。模型是由實體類和表示資料庫會話的上下文對象構成。上下文對象允許查詢並保存數據。
創建的實體類被稱為POCO類(「普通的CLR對象」)因為他們沒有在EF Core中有任何依賴。它們定義存儲在資料庫中的數據的屬性。
一、添加一個實體類
- 在Visual Studio 2022的解決方案資源管理器中,右鍵單擊該RlazorAppDemo,在彈出菜單中選擇,項目–>添加–>新建文件夾,修改文件夾名稱為「Models」。如下圖。
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; } } }
之前的程式碼中我們創建了一個DbSet<Book>類型的屬性Book.在實體框架中,實體集合通過對應資料庫中的表,實體對應表中的行。
三、添加資料庫連接字元串
在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 |