iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
Modern Web

我與 ASP.NET Core 的 30天系列 第 5

[Day05] Entity Framework Core與DB First - 我與 ASP.NET Core 3 的 30天

Entity Framework Core 基本介紹

Entity Framework 是一個 ORM(Object Relational Mapping)框架,可以大幅減少開發時期大量的撰寫資料庫語法進行資料存取,並且能透過強型別來取得與操作物件資料。

Entity Framework Core (以下簡稱EF Core) 是2016年微軟將Entity Framework 6 重寫,大部分 APIs 都跟 Entity Framework 6 一模一樣

今天就來介紹 ASP.NET Core 使用 EF Core 來存取 Mariadb(MySQL)資料庫

EF Core 有提供兩種開發方式 DB First 與 Code First

本篇將以 DB First 為主,介紹如何搭配EF Core 存取現有的資料庫

安裝所需套件

首先要先安裝 dotnet ef 的全域工具,才能使用dotnet ef的指令
dotnet tool install --global dotnet-ef

接著我們在現有的ASP.NET Core專案底下開啟 terminal 並執行以下指令用來安裝EF Core的nuget套件

dotnet add package Pomelo.EntityFrameworkCore.MySql
(資料庫的Provider,用來與相對性的資料庫溝通)
dotnet add package Microsoft.EntityFrameworkCore.Design
(沒有安裝無法透過cli 使用資料庫產生實體)

如果想使用其他資料庫,可以參考其他EF Core資料庫提供者

使用指令產生EF實體

安裝完之後要透過以下指令來透過資料庫產生實體
dotnet ef dbcontext scaffold "server=localhost;Port=3306;Database=Blog; User=root;Password=test1234;" "Pomelo.EntityFrameworkCore.MySql" -o ./Models -c BlogContext -f

指令說明:
dotnet ef dbcontext scaffold "<連線字串>" "<使用的資料庫提供者套件>" -o<是否要輸出在另外一個資料夾> <輸出的資料夾> -c <名稱Context> -f

-o 與輸出資料夾沒有填的話,會在當前目錄產生檔案
-c 與名稱Context沒有填的話,會以Database的名稱作為DbContext名稱
-f 則是宣告要複寫原有檔案

更詳細內容可參考官方文件

注意事項:要在專案可以成功建置的情況下才能下這個指令,如果專案內有錯誤的情況下輸入指令則會顯示Build failed

以上指令輸入完畢之後就會在 Models目錄中看到產生出來的類別
https://ithelp.ithome.com.tw/upload/images/20200919/20129389WG13mfI2OU.png

接著我們在 Startup中註冊BlogContext

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<BlogContext>();
    services.AddControllers();
}

註冊之後就可以在其他類別內注入BlogContext並使用了

private readonly BlogContext _db;

public SampleController(BlogContext dbContext)
{
    _db = dbContext
}

使用EF Core 進行資料存取

接著下面的範例就使用注入的BlogContext,來做EF Core的基礎資料操作

基礎操作 新增資料

var post = new Post {
 Url = "",
 Title = "EF Core",
 Read = 0
};

_db.Post.Add(post);
_db.SaveChanges();

基礎操作 查詢資料

var id = 1;
var post = _db.Post.Find(id);
var posts = _db.Post.Where(p ⇒ p.Read > 10).OrderBy(p ⇒ p.id)

基礎操作 更新資料

var post = _db.Post.Find(1);
post.Url = "http://google.com";
_db.SaveChanges();

基礎操作 刪除資料

var post = db.Post.Find(1);
db.Post.Remove(post);
db.SaveChanges();

結語

上述範例可看到,EF Core 可透過Linq的語法對資料庫作查詢

EF Core會將Linq的語法透過 資料庫提供者(Database Providers) 解析成SQL語法並執行

呼叫 LINQ 運算子時,只會在記憶體中建立一個表達查詢的物件
只有在取得查詢結果時,才會將產生的 SQL 傳送到資料庫執行,例如:

  • 透過foreach跑迴圈取得所有結果
  • 執行像是 ToList、ToArray、Single、Count 諸如此類的方法
  • 透過資料繫結綁定(DataBinding)查詢到UI控制項中(WinForm,WPF,...)

正確的使用LINQ To SQL 與否對於效能上的差異會非常大,所以上述的重點還是得非常謹慎去使用的。

下一篇將會介紹使用EF Core Code First的方式進行資料庫轉移及版控。

相關連結
官方文件


上一篇
[Day04] 依賴注入 (Dependency Injection) - 我與 ASP.NET Core 3 的 30天
下一篇
[Day06] Entity Framework Core 的 CodeFirst與資料庫版控 - 我與 ASP.NET Core 3 的 30天
系列文
我與 ASP.NET Core 的 30天31

尚未有邦友留言

立即登入留言