關於 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 指令操作,更多指令請參考 套件管理主控台
注意事項:
- 執行前會先建置起始專案,建置失敗會無法執行
- 套件管理員主控台中的預設專案要選擇要建立資料庫 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 的方式建立資料庫,以下操作皆以
- NuGet 套件管理元
- PowerShell(套件管理主控台)
- 搭配 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,包含兩個欄位
- Id
- 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 這張資料表來說明,需要注意以下幾個部分
- 繼承 DbContext
- 建構子參數(MSDN DbContext Class)
- 欲建立的資料表與細部關聯定義
// 繼承 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