曾經我以為再也不會去弄啥Database First,然鵝我錯了。這個世界上就是有啪啪打臉和真香的時候。當小夥伴拿著做好的DB表結構和SQL指令碼遞過來的時候,我知道我沒法拒絕。望著他突起的肱二頭肌和充滿殺意的臉龐,我怎能忍心說,來來來,我們Code First一把……
DB First嘛,首先我們要確保本地有DB才行,本篇我們使用免費的SQL Server LocalDB來舉例。LocalDB可以從MSDN下載安裝包,也可以直接通過Visual Studio安裝。
安裝完成後,我們使用Visual Studio來連線LocalDB(當然也可以下載更強大的SQL Sever Management Studio)。首先我們開啟Visual Studio的View -> SQL Server Object Explorer。預設應該已經連線到LocalDB了,如果沒有可以通過頂層節點右鍵選單Add SQL Server來手動操作。
我們通過以下SQL語句在master庫建立一張測試用的表。
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