關於 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
- -Connection "ConnectString":可以參考 MSDN 連接字串語法 來設定
- Microsoft.EntityFrameworkCore.SqlServer:Database Provider,這邊使用 MSSQL
- -OutputDir Models:資料庫 Model 建立位置
- -context Northwind:DB Context 名稱
注意事項:
- 執行前會先建置起始專案,建置失敗會無法執行
- 套件管理員主控台中的預設專案要選擇要建立資料庫 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