EntityFramework 是一個實現 ORM 的一個工具,而 EntityFrameworkCore 則是它的輕量版,簡單來說就是可以在專案中寫好需要的 Model 後,再用它產生對應的 Table,不用再自己執行 SQL。
安裝
安裝 Microsoft.EntityFrameworkCore
使用 .NET Core CLI 安裝
dotnet add package Microsoft.EntityFrameworkCore
使用 NuGet 安裝
在 NuGet 套件管理員 搜尋套件,並安裝。
這邊要注意版本,如果太高會出現 Unable to cast object of type 'ConcreteTypeMapping' to type 'Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping'.
的錯誤,此時請緩降版本直到正常執行。
建立 Model 與 Context
以下是建立一個 User Model 的範例與 Context 內的設定方式。
User.cs
public class User
{
public string UserId { get; set; }
public string Account { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
說明:
- Model 通常為單數,當 EF 去建立 Table 時,會轉成複數。
- 每個 Model 都要有一個欄位當作主鍵,預設會嘗試使用
Id
或<Name>Id
,如果要客製化名稱可以使用[key]
來直接指定,沒有這個欄位時會噴錯。 - 每個公開的欄位將會自動產生對應的資料庫欄位,如要排除可以為欄位加上
[NotMapped]
。
在 Model 中可以直接指定實體的關聯,也可以利用 Data Annotations
來設定許多資料行欄位的屬性,未來再另行打成一篇筆記,如有先需更詳細說明可洽官方文件
ExampleContext.cs
public class ExampleContext : DbContext
{
public DbSet<User> Users { get; set; }
private string _dbConnectString = "Data Source=127.0.0.1;Initial Catalog=mydb;persist security info=True;user id=sa;password=Ab123456";
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_dbConnectString);
}
}
說明:
- 需手動為每個 Model 新增對應的 DbSet。
- 常見的 DB 連線類型: (要安裝對應的Database Provider)
UseSqlServer
: SQL ServerUseSqlite
: SQLiteUseNpgsql
: PostgreSQLUseMySQL
: MySQL
建立 Migration
使用 Migration 來管理資料庫,不僅讓資料庫的變化納入版控管理,安裝環境或部署時也不用執行 SQL,直接下指令就可以裝好對應版本的資料庫,實在是非常方便的 黑魔法。在 PHP 著名框架 Laravel 也是用 Migration 來管理資料庫的變更的。
執行 dotnet ef migrations add InitialCreate
讓程式自動依照剛剛所寫的 Model 與 Context 來產生對應的 Migration 檔案。
執行完後就會看到在專案根目錄下產生出 Migrations 的資料夾。
建立 Table
執行 dotnet ef database update
來套用剛剛產生的 Migration 套用至資料庫。
執行完後就可以連到資料庫查看是否已有產生剛剛設定的 Table
基本查詢
取得所有資料
using (var context = new ExampleContext())
{
var users = context.Users.ToList();
}
取得指定的一筆資料
using (var context = new ExampleContext())
{
var user = context.Blogs
.Single(b => b.UserId == 1);
}
加入 Where 條件
using (var context = new ExampleContext())
{
var users = context.Users
.Where(b => b.Name.Contains("Puck"))
.ToList();
}
更多查詢方法,可以參考官方文件
Puck Wang
Hi! 我是 Puck Wang,這個部落格的作者,是一位全端網站開發者,常使用 .Net 和 React 進行開發,專注於架構研究,你可以在這個部落格看到我精選的筆記內容,希望對你會有所幫助。
更多關於我的訊息,可至關於關於頁面。