2-3.ASP.NET Core MVC 入門教學 - Entity Framework Core,使用Code First

ASP.NET Core MVC 入門教學


比起Datebase First,Code First要在vs這邊做的作業就比較多了

主要原因就是把本來在SQL Server 上建立資料表的動作,移到了程式這邊來做

那本課程的範例檔資料庫,也會是使用Code First方式來實作

主要是上一個課程雖然有提供mdf檔,讓大家可以正常的運作範例檔

但後來發現,mdf檔也有版本,會因為大家的環境不一樣,還需要做很多調整

所以這次改成用Code First的方式,資料庫環境由大家自己準備,範例檔需要的相關資料表就由Code First方式寫回去

這樣就比較不會有範例檔執行上的問題


Code First雖然一切都在vs這邊打好程式碼,盡量不碰到資料庫

但首先我們還是要先把資料庫環境先建立一開頭,不然沒有資料庫環境,也就沒有地方給我們將code的內容回寫建立相關資料庫

那這邊資料庫環境就依自己的喜好先架好,我這邊就不教學了

那我這邊使用的是SQL Server,我就先建立好了一個Kcg的資料庫和Kcg的登入帳號

那首先要使用Code First,需要先安裝以下二個套件:

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools

到方案總管的相依性>套件>管理NuGet套件 

到上圖的導覽搜尋上面幾個套件然後進行安裝

接著開始建立你想要的資料表欄位

我們建立一個Models的資料夾,並在下面新增一個類別,這是對應你資料庫的資料表檔案

假使我們有一個資料表要取名為TOPMenu,那我們就建立一個TOPMenu的class

接著在裡面打上對應的欄位名稱

namespace Kcg.Models;

public partial class TOPMenu
{
    public Guid TOPMenuId { get; set; }

    public string Name { get; set; } = null!;

    public string Url { get; set; } = null!;

    public string Icon { get; set; } = null!;
}

接著在建立一個資料庫物件檔KcgContext.cs,那這邊可以依照你的資料庫名稱取名

裡面我們先打上以下內容

public partial class KcgContext : DbContext
{
    public KcgContext()
    {
    }

    public DbSet<TOPMenu> TOPMenu { get; set; }
}

接著我們就可以下指令來準備把這些內容回寫到我們的SQL Server裡了

Add-Migration InitialCreate

這時候會不能執行,主要還少一個重要的東西,就是沒告訴他要寫回哪裡的資料庫

所以我們在修改一下KcgContext.cs,加上以下內容,下面就是資料庫連線字串

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("Data Source=伺服器位置;Database=資料庫;Trusted_Connection=True;TrustServerCertificate=True;User ID=帳號;Password=密碼");
}

那這樣的寫法並不好,不過我們這邊先暫時用這樣寫,下一篇會再教另一種方式

這時再一次執行指令

Add-Migration InitialCreate

執行完後就會多一個Migrations資料夾,裡面放的就是準備回寫至資料的程式碼,跟以後修改的歷程記錄

接著我們在下一個指令

Update-Database

成功之後我們回到我們的資料庫看

就會看到TOPMenu的資料表被建好了,還有另一個是Code First的紀錄資料表

不過這時候我們點進去看資料表的欄位

雖然欄位名稱都跟我們建的類別檔內容一樣,但似乎哪裡可能還需要做調整

沒錯,資料類型可能不見得是我們要的,譬如我這邊不想要長度是MAX

那我們就要回頭到KcgContext.cs增加一些東西,畢竟你不告訴它你要什麼,它怎麼會知道

所以再加上以下程式碼

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<TOPMenu>(entity =>
    {
        entity.Property(e => e.TOPMenuId).HasDefaultValueSql("(newid())");
        entity.Property(e => e.Icon).HasMaxLength(50);
        entity.Property(e => e.Name).HasMaxLength(50);
        entity.Property(e => e.Url).HasMaxLength(50);
    });
}

這邊我想要讓主鍵可以自動產生Id所以下了一個sql函式newid()

接著就是個欄位的長度50就好

加完之後我們要紀錄一下,我的表格有做更新

Add-Migration TOPMenuUp

這邊Add-Migration後面的英文式自己取的一個紀錄名稱,那我這邊要更新TOPMenu所以叫TOPMenuUp

成功之後就會多一個紀錄檔

接著在執行更新資料庫指令

Update-Database

成功之後我們在回到資料庫看看,應該都會進行修正成我們要的了

以上就是Code First基本的操作

看起來好像麻煩不少,那主要的原因是因為把本來在資料庫裡設計的工作,都轉成在程式這邊設計了

也就是多了一份資料庫設計的工作要做,但是是用Code來做

那這樣的好處是什麼?

大概就是能不用開啟資料庫環境,直接在vs2022上改完code,資料庫環境也跟著修改

你就不用開著兩邊修改,而我們也只要學會怎麼用code寫資料庫,而不用去學資料庫怎麼操作

其實微軟一直有在各方面做把事情單一化的功能,就是你只要學一個東西,就可以使用到各個不同的地方

但好不好用就見仁見智了XD


那這邊順帶一提,可能有人會跟我剛接觸Code First時有個疑問

就是這是在開發環境可以這樣做,那我在正式環境的時候,難道要用vs去連正式環境的資料庫去做資料庫更新嗎?

當然不是,其實跟你原來的做法一樣就好

就算是用Database First你先在開發環境建好資料庫,到時候到了正式環境,你可能是用匯出SQL,或精靈方式

把開發環境的資料庫建到正式環境,或給DBA相關更新SQL指令,請他更新上去

那在Code First也是一樣的作法,你只是在開發環境用Code First建好開發環境的資料表

但之後你一樣是從SQL Server去匯出相關更新SQL,或精靈匯出,之後再帶到正式環境去更新

差別只差在Database First是你自己在SQL Server上建資料表,而Code First是指令工具幫你建的

最後開發環境上都會有一個跟你程式相符的資料庫內容

然後你再用你原本怎麼移轉到正式環境的方式即可

不需要一定要用Code First的工具建的才能夠運作,資料庫裡的資料表結構都一樣即可




Copyright © 凱哥寫程式 2022 | Powered by TalllKai ❤