1. Entity Framework - DBFirst


Posted by WayneCheng on 2021-03-06

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

1. 關於 DBFirst & CodeFirst

2. EF6 & EFCore

3. DBFirst


測試環境:

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


1. 關於 DBFirst & CodeFirst

在 EntityFramework 出來之前基本上應該都是使用 DBFirst 為主在開發,Connection String 設定好,撰寫 SQL 語法來連接資料庫取資料,可能是因為效能,也可能是因為修改成本,這個模式應該到目前為止都還有不少專案還在使用中,只是可能是改由使用 Dapper 之類的 ORM (Object-relational mapping)在處理。

EntityFramework 橫空出世之後,由於 MVC 中將資料庫建立成 Model 的介面太過方便,滑鼠在 VisualStudio 中點幾下就能在專案中加入資料庫 Model 並連接到資料庫,資料庫欄位異動時頂多也只是跟以前一樣先修改資料庫欄位,接著專案中 Model 更新改為同步資料庫欄位的異動,整體來說,並沒有讓開發人員覺得太麻煩,所以還是多以維持 DBFirst 開發模式為主。

直到 .NET Core 出世之後,這時 VisualStudio 中點幾下就完成資料庫連接的操作消失了,才真正迎接 CodeFirst 的時代,透過指令就能將欄位的異動同步到資料庫、透過指令就能將資料庫欄位還原到特定版本、資料庫中也記錄著每次異動讓每次同步能準確更新差異的部分,種種好處都讓人覺得 CodeFirst 真是太香了,因此大多新專案採用 CodeFirst 的開發方式了。


2. EF6 & EFCore

兩者詳細比較可以參考 MSDN 比較EF6 和EF Core 底下僅列一些重點

EF6 EF Core
舊版,支援 .NET Core 新版
穩定但不積極開發 不完全包含 EF6 功能
EF Core 中新功能不會更新至 EF6 EF Core 功能以新版為主

3. DBFirst

接下來會實作在 .NET 5 中使用 EF Core 透過 DBFirst 的方式連接資料庫

3.0 資料庫

可以用現有資料庫,或是建立一個新的資料庫做為測試用,範例中將使用 Northwind sample database

3.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

3.2 透過 套件管理員主控台 執行 PowerShell 指令

開啟套件管理主控台

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

匯入資料庫 Model 指令

Scaffold-DbContext -Connection "Persist Security Info=False;User ID=[loginId];Password=[Password];Initial Catalog=Northwind;Server=[DB_IP]" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -context Northwind
  1. -Connection "ConnectString":可以參考 MSDN 連接字串語法 來設定
  2. Microsoft.EntityFrameworkCore.SqlServer:Database Provider,這邊使用 MSSQL
  3. -OutputDir Models:資料庫 Model 建立位置
  4. -context Northwind:DB Context 名稱

注意事項:

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

執行後會看到

Build started...
Build succeeded.

執行完畢後可以在資料夾中看到自動建立出來的 Model

3.3 專案中加入連線字串

如果是 Web 專案,在 Startup 中 ConfigureServices 加入連線字串

var connectionString = @"Persist Security Info=False;User ID=[loginId];Password=[Password];Initial Catalog=Northwind;Server=[DB_IP]";
    services.AddDbContext<ContextName>(options => options.UseSqlServer(connectionString));

接著在 Controller 中注入 Context 即可使用

本次範例中專案使用主控台應用程式

static async Task Main(string[] args)
{
    var connectionString = @"Persist Security Info=False;User ID=[loginId];Password=[Password];Initial Catalog=Northwind;Server=[DB_IP]";

    // 透過 .AddDbContext 將 Northwind 註冊到 DI 容器
    await using (var services = new ServiceCollection()
        .AddDbContext<Northwind>(options => options.UseSqlServer(connectionString))
        .BuildServiceProvider())
    {
        // 透過 DI 容器取得物件
        var dbNorthwind = services.GetRequiredService<Northwind>();

        // 取得全部 employee 資料
        var employees = await dbNorthwind.Employees.ToListAsync();

        Console.WriteLine("Employee Info");

        foreach (var employee in employees)
        {
            Console.WriteLine($"Id: {employee.EmployeeId}, Name: {employee.FirstName} {employee.LastName}");
        }
    }

    Console.ReadLine();
}

執行結果

Employee Info
Id: 1, Name: Nancy Davolio
Id: 2, Name: Andrew Fuller
Id: 3, Name: Janet Leverling
Id: 4, Name: Margaret Peacock
Id: 5, Name: Steven Buchanan
Id: 6, Name: Michael Suyama
Id: 7, Name: Robert King
Id: 8, Name: Laura Callahan
Id: 9, Name: Anne Dodsworth

完整程式碼

GitHub:DBFirst


總結

雖然要使用 DBFirst 沒什麼不行,但 CodeFirst 好處多多,接下來會介紹如何使用 CodeFirst 跟相關 Migrations 指令,如果是即將開發或是開發中的專案原本打算使用 DBFirst,都建議可以考慮改用 CodeFirst 的方式進行開發。


參考資料

  1. MSDN 比較EF6 和EF Core
  2. Northwind sample database
  3. MSDN Database Provider
  4. MSDN 連接字串語法

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


#.NETCore #Database #MSSQL #EntityFramework







Related Posts

CS 50 Dynamic Memory Allocation

CS 50 Dynamic Memory Allocation

React-[核心篇]- React渲染功能在後台是怎麼運作的?

React-[核心篇]- React渲染功能在後台是怎麼運作的?

[ 筆記 ] CSS - FlexBox

[ 筆記 ] CSS - FlexBox


Comments