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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章