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 Server
    • UseSqlite : SQLite
    • UseNpgsql : PostgreSQL
    • UseMySQL : 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

Puck Wang

Hi! 我是 Puck Wang,這個部落格的作者,是一位全端網站開發者,常使用 .Net 和 React 進行開發,專注於架構研究,你可以在這個部落格看到我精選的筆記內容,希望對你會有所幫助。

更多關於我的訊息,可至關於關於頁面。