天天看點

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

曾經我以為再也不會去弄啥Database First,然鵝我錯了。這個世界上就是有啪啪打臉和真香的時候。當小夥伴拿着做好的DB表結構和SQL腳本遞過來的時候,我知道我沒法拒絕。望着他突起的肱二頭肌和充滿殺意的臉龐,我怎能忍心說,來來來,我們Code First一把……

DB First嘛,首先我們要確定本地有DB才行,本篇我們使用免費的SQL Server LocalDB來舉例。LocalDB可以從MSDN下載下傳安裝包,也可以直接通過Visual Studio安裝。

.NET Core學習筆記(8)——Entity Framework Core之Database First
安裝完成後,我們使用Visual Studio來連接配接LocalDB(當然也可以下載下傳更強大的SQL Sever Management Studio)。首先我們打開Visual Studio的View -> SQL Server Object Explorer。預設應該已經連接配接到LocalDB了,如果沒有可以通過頂層節點右鍵菜單Add SQL Server來手動操作。
.NET Core學習筆記(8)——Entity Framework Core之Database First
我們通過以下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對象(當然把這兩個工程合并為一個也是可以的)。目前工程的結構如下:

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

接着我們添加Entity Framework Core的references,DataAccess作為資料通路層會使用到EntityFrameworkCore.SqlServer和EntityFrameworkCore.Tools這兩個庫。當然除了SqlServer,也可以替換成Sqlite等其他Provider。圖中并沒有更新到最新的5.0.1,這是因為我還在用.NET Core 3.1。如果開發實際項目的話,不妨等到.NET 5.x的LTS版本再全面切換過去。

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

在我們的Sample中,EfDatabaseFirst作為啟動項,需要依賴EntityFrameworkCore.Design庫。同時它還需要引用DataAccess工程。

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

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 

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

記得Default project要選DataAccess,否則Models檔案夾會跑到EfDatabaseFirst工程裡去了。在指令成功運作後,Solution Explorer的結構如下:

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

如果點開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