曾經我以為再也不會去弄啥Database First,然鵝我錯了。這個世界上就是有啪啪打臉和真香的時候。當小夥伴拿着做好的DB表結構和SQL腳本遞過來的時候,我知道我沒法拒絕。望着他突起的肱二頭肌和充滿殺意的臉龐,我怎能忍心說,來來來,我們Code First一把……
DB First嘛,首先我們要確定本地有DB才行,本篇我們使用免費的SQL Server LocalDB來舉例。LocalDB可以從MSDN下載下傳安裝包,也可以直接通過Visual Studio安裝。

CREATE TABLE [dbo].[Todoes] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Description] NVARCHAR (MAX) NULL,
[CreatedDate] DATETIME NOT NULL,
[Done] BIT DEFAULT ((0)) NOT NULL,
CONSTRAINT [PK_dbo.Todoes] PRIMARY KEY CLUSTERED ([ID] ASC)
);
至此我們的準備工作算是完成了。接下來我們要通過Entity Framework Core來對Todoes表做Object映射,生成C#的實體類。
首先在Visual Studio 2019中建立空的.NET Core的Console程式作為啟動項,再建立一個.NET Standard的Library用以生成Entities Class以及DbContext對象(當然把這兩個工程合并為一個也是可以的)。目前工程的結構如下:
接着我們添加Entity Framework Core的references,DataAccess作為資料通路層會使用到EntityFrameworkCore.SqlServer和EntityFrameworkCore.Tools這兩個庫。當然除了SqlServer,也可以替換成Sqlite等其他Provider。圖中并沒有更新到最新的5.0.1,這是因為我還在用.NET Core 3.1。如果開發實際項目的話,不妨等到.NET 5.x的LTS版本再全面切換過去。
在我們的Sample中,EfDatabaseFirst作為啟動項,需要依賴EntityFrameworkCore.Design庫。同時它還需要引用DataAccess工程。
References的添加到此也完成了,現在我們要通過Visual Studio的Package Manage Console視窗來生成實體類。這和.NET 4時代的體驗稍有不同,不再有edmx檔案了。我想現在大量的通過CLI來替代GUI,也是為了更好的跨平台,讓使用Visual Studio Code的Linux小夥伴們有着一緻的體驗。就是苦了我這樣喜歡點點點的懶人……
最後我們要在Package Manage Console中輸入Scaffold-DbContext指令。
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=master;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
詳細的文法請參考MSDN:Scaffold-DbContext
記得Default project要選DataAccess,否則Models檔案夾會跑到EfDatabaseFirst工程裡去了。在指令成功運作後,Solution Explorer的結構如下:
如果點開Todoes類,會看到下面的代碼,和資料庫的表結構做了完美的映射。假使我們的資料庫已經設計了100張表,生成實體類也隻是一瞬間的事情,如果人肉來做這件事情,996是必不可少的……
namespace DataAccess.Models
{
public partial class Todoes
{
public int Id { get; set; }
public string Description { get; set; }
public DateTime CreatedDate { get; set; }
public bool Done { get; set; }
}
}
本篇我們讨論了如何使用Entity Framework Core的Database First模式來建立實體類。并沒有讨論如何使用實體類和DbContext對象。我想把這些留到下一篇Code First。畢竟Code First是更為主流,與Code結合也更為緊密。資料庫這種事情,還是DBA比較擅長才對。
SampleCode:
https://github.com/manupstairs/EntityFrameworkCoreSamples