.NET Core學習筆記(8)——Entity Framework Core之Database First

樓上那個蜀黍發表於2020-12-31

曾經我以為再也不會去弄啥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

 

相關文章