2. Entity Framework - CodeFirst


Posted by WayneCheng on 2021-03-13

關於 CodeFirst 本篇將討論以下幾個問題

1. 關於 .NET Core CLI & PowerShell

2. 透過 CodeFirst 從無到有建立資料庫


測試環境:

OS:Windows 10
IDE:Visual Studio 2019
MS SQL:SQL Server 2019 Linux
SSMS:Microsoft SQL Server Management Studio 18


1. 關於 .NET Core CLI & PowerShell

我們可以透過 .NET Core CLI (EF Core 命令列工具) & PowerShell (套件管理員主控台) 來操作 NuGet 套件的安裝與 Migrations 命令的操作。

官方建議

  • 使用 Visual Studio 時,請考慮使用 套件管理員主控台 代替 CLI 工具。
  • 如果不是使用 Visual Studio,建議改用 EF Core 命令列工具

1.1 PowerShell (套件管理員主控台)

[VisualStudio]→[工具]→[NuGet 套件管理員]→[套件管理員主控台]

安裝套件除了直接使用指令外,也可使用 NuGet 來安裝,主要用來進行 Migrations 指令操作,更多指令請參考 套件管理主控台

注意事項:

  1. 執行前會先建置起始專案,建置失敗會無法執行
  2. 套件管理員主控台中的預設專案要選擇要建立資料庫 Model 的專案

1.2 .NET Core CLI (EF Core 命令列工具)

[開始]→[命令提示字元]

開啟後可透過以下指令進行操作,更多指令請參考 .NET Core CLI

// 安裝通用工具
dotnet tool install --global dotnet-ef

// 更新通用工具
dotnet tool update --global dotnet-ef

// 安裝套件
dotnet add package Microsoft.EntityFrameworkCore.Design

// 確認安裝狀態
dotnet ef

2. 透過 CodeFirst 從無到有建立資料庫

接下來會實作在 .NET 5 中使用 EF Core 透過 CodeFirst 的方式建立資料庫,以下操作皆以

  1. NuGet 套件管理元
  2. PowerShell(套件管理主控台)
  3. 搭配 Entity Framework Core

2.1 在 NuGet 中安裝擴充套件

透過 NuGet 安裝三個 Entity Framework 主要套件

  • Entity Framework Core
Microsoft.EntityFrameworkCore
  • Database Provider,這邊使用的是 MSSQL
Microsoft.EntityFrameworkCore.SqlServer

EF Core Database Provider 列表:MSDN Database Provider

  • 指令工具,安裝後才能操作 Migrations 指令
Microsoft.EntityFrameworkCore.Tools

2.2 建立 Model

依據資料庫欄位設計建立相對應的 Model,這邊設計了一個 User (使用者) 的 Model,包含兩個欄位

  1. Id
  2. Name (使用者名稱)

Entity Framework Core 會預設將 ID 或 classnameID 作為主索引鍵

public class User
{
    // EF Core 預設會解譯名為 ID 或 classnameID 作為主索引鍵的屬性
    // 這邊的話就會是 Id 或 UserID
    public int Id { get; set; }
    public string Name { get; set; }
}

2.2 建立 OOOContext

這邊的 OOOContext 命名通常會以 [DB Name]Context 或是直接使用 [DB Name] 的方式來命名。

Entity Framework Core 會透過自定義的 Context 內容來建立資料表與欄位間關聯,細節可參考下一篇,我們先單純以建立 Users 這張資料表來說明,需要注意以下幾個部分

  1. 繼承 DbContext
  2. 建構子參數(MSDN DbContext Class)
  3. 欲建立的資料表與細部關聯定義
// 繼承 DbContext
public class DataContext : DbContext
{
    // 建構子參數 DbContextOptions<T> 並傳入父類別
    public DataContext(DbContextOptions<DataContext> options)
        : base(options)
    {
    }

    // 一般習慣在 Model 命名使用單數,這邊資料表命名使用複數
    public DbSet<User> Users { get; set; }
}

2.3 Startup 中加入連線資訊

連線字串可以參考 MSDN 連接字串語法

連線字串中的「Catalog=[DB_Name]」會在資料庫不存在時以此名稱建立資料庫

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    // 加入連線資訊 & 將 DataContext 加入 DI 容器中
    // 以下連線字串請將 [ ] 中的內容自行替換
    var connectionString = @"Persist Security Info=False;User ID=[loginId];Password=[Password];Initial Catalog=[DB_Name];Server=[DB_IP]";
    services.AddDbContext<DataContext>(options => options.UseSqlServer(connectionString));
}

2.4 建立 Migrations

[VisualStudio]→[工具]→[NuGet 套件管理員]→[套件管理員主控台]

// EF6:
Enable-migrations

// EF Core:
Add-Migration InitialCreate

執行完後會看到以下訊息

Build started...
Build succeeded.
To undo this action, use Remove-Migration.

接著可以在專案中找到自動建立名為 Migrations 的目錄,並有一些自動產生的檔案,關於 Migrations 的內容會在下篇再詳細說明,到此建立資料庫的準備已大致完成。

2.4 建立資料庫

[VisualStudio]→[工具]→[NuGet 套件管理員]→[套件管理員主控台]

// 將異動更新至資料庫
Update-database

執行完後會看到以下訊息

Build started...
Build succeeded.
Done.

此時已將資料庫建置完畢,在資料庫中可以看到我們建立好的資料表

2.5 查詢

這邊開始前我們先在資料庫中新建幾筆測試資料

Id Name
1 Wayne
2 Leo
3 Henry

接著在 Constructor 中注入 DataContext

public class HomeController : Controller
{
    private readonly DataContext _dataContext;

    public HomeController(DataContext dataContext)
    {
        _dataContext = dataContext;
    }
{

取得資料

var data = _dataContext.Users.ToList();

完整程式碼

GitHub:CodeFirst


總結

本篇主要是說明 Code First 從無到有建立資料庫的過程,實際應用上情況會複雜許多,包含資料表與欄位間複雜的關聯與進退版等問題,這些會在後續詳加說明。


參考資料

  1. 套件管理主控台
  2. .NET Core CLI
  3. MSDN Database Provider
  4. MSDN 連接字串語法

新手上路,若有錯誤還請告知,謝謝


#.NETCore #Database #MSSQL #EntityFramework







Related Posts

[ js 筆記 ] 一次搞懂Javascript中的slice()、splice()、split()

[ js 筆記 ] 一次搞懂Javascript中的slice()、splice()、split()

Todo list_Part2:UI 拿出資料與串接後端

Todo list_Part2:UI 拿出資料與串接後端

AI輔導室|製作上平下凹的拱形效果

AI輔導室|製作上平下凹的拱形效果


Comments