Entity Framework Core(一) - acaj2018 的部落格 - udn部落格
acaj2018 的部落格
作家:資訊小幫手
文章分類
    Top
    Entity Framework Core(一)
    2024/02/02 10:32:11
    瀏覽:84
    迴響:0
    推薦:0
    引用0

    本篇文將介紹用Visual Studio 在Web應用程式專案,如何去使用 Entity Framework Core 去做CRUD
    1. 建立ASP .NET Core Web應用程式專案,並選擇.net6.0,這邊我們將專案名稱鍵入 EntityFrameworkCoreWebTest,或是您自己取的名稱
    2. 安裝以下Nuget套件

    •  Microsoft.EntityFrameworkCore //EntityFrameworkCore實體
    •  Microsoft.EntityFrameworkCore.SqlServer //根據你連線的SQL去做選擇
    •  Microsoft.EntityFrameworkCore.Tools //方便我們之後透過套件管理員主控台去實現反向工程

    3. 在SQL Server上建立資料庫,或是用現有的資料庫及可省略此步驟,以下我將使用本機MS SQL名稱為TestDB的資料庫做範例
    4. 建立好資料庫後準備來進行反向工程,讓Entity Framework 幫我們生成Model的程式碼,
    5. 開啟 套件管理器主控台( 檢視(V) -> 其他視窗(E) ->套件管理器主控台(O)) , 把Visual Studio的啟動專案跟套件管理器主控台的預設專案都改為 EntityFrameworkCoreWebTest

    6. 調整預設專案後,在套件管理器主控台輸入Scaffold-DbContext data source=.;initial catalog=TestDB;Integrated Security = true Microsoft.EntityFrameworkCore.SqlServer -OutputDir DBModels -Force
    ※Scaffold-DbContext後面接的是SQL的連線字串,接下來緊接的是資料庫類型,因為我們用的是MS SQL所以寫Microsoft.EntityFrameworkCore.SqlServer,接著就是參數了,這邊使用的-OutputDir是輸出的位置,例如我們這邊填的是”DBModels”,就會在專案內新增一個DBModels資料夾,並將反向工程產出的cs檔案放資料夾內;而-Force會覆蓋已存在的檔案,方便我們修改資料庫結構時直接編輯檔案,更多指令請參考微軟官方說明https://learn.microsoft.com/en-us/ef/core/cli/powershell
    7. 接著就會產生出相關的cs檔案,其中TestDBContext為繼承DBContext的DbContext 實體,而因為我的資料庫內只有User這張table,所以只產出User.cs

    8. 搞定Model後,接下來我們來處理連線字串,因為剛剛反向工程(Scaffold-DbContext)內有輸入連線字串,故在TestDBContext.cs的OnConfiguring內會直接幫你寫上連線字串,如果今天你只是方便測試而需要去修改連線的資料庫時,直接修改這邊即可,但寫死在這邊顯然不是一個好方法

    9. 修改Program.cs的程式碼,將TestDBContext注入

    1. var builder = WebApplication.CreateBuilder(args);
    2. var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); //讀取appsettings.json內的DefaultConnection
    3. builder.Services.AddDbContext<TestDBContext>(options =>
    4. {
    5. options.UseSqlServer(connectionString); //帶入DefaultConnection
    6. });

    10. 修改appsetting.json的內容,增加ConnectionStrings連線字串,讓Program可以讀取到

    1. {
    2. "ConnectionStrings": {
    3. "DefaultConnection": "data source=.;initial catalog=TestDB;Integrated Security = true"
    4. },
    5. ***
    6. }

    11. 完成Program.cs與appsetting.json後,第11步的optionsBuilder.IsConfigured在執行時就會變成true,故不會再載入先前反向工程寫死的連線字串
    12. 處理好連線字串後,接下來準備實際讀寫資料庫,開啟Index.cshtml.cs,並在建構式加入TestDBContext connectionDB 參數,並存在物件中,方便底下直接call

    1. private readonly TestDBContext _testDBContext;
    2.
    3. public IndexModel(TestDBContext connectionDB)
    4. {
    5. _testDBContext = connectionDB;
    6. }

    13. 新增Insert,最後面別忘了SaveChanges,將修改存入

    1. _testDBContext.Users.Add(new User() {
    2. UserName = "User" ,
    3. Account = "User",
    4. Tel = "12345678",
    5. Email = $" Code@ccc.cc",
    6. CrtAt = DateTime.Now
    7. });
    8. _testDBContext.SaveChanges();

    14. 讀取Read & 編輯Update,這邊先撈取UserId為1的User,並將CrtAt改為現在時間後存入

    1. var user= _testDBContext.Users.First(o => o.UserId == 1);
    2. user.CrtAt = DateTime.Now;
    3. _testDBContext.Users.Update(user);
    4. _testDBContext.SaveChanges();

    15. 讀取Read & 刪除Delete,這邊先撈取UserId為1的User後將其刪除

    1. var user= _testDBContext.Users.First(o => o.UserId == 1);
    2. _testDBContext.Users.Remove(user);
    3. _testDBContext.SaveChanges();

    16. 結論

    於篇幅先介紹到這, Entity Framework Core 這種ORM(Object Relational Mapping)物件關聯對映的架構幫你在開發時期省下了煩惱SQL語法的時間,再加上提供的反向工程,甚至一行model都不用打,下次有機會再介紹更多的 Entity Framework Core 好用的地方!

    參考資料
    1. https://learn.microsoft.com/en-us/ef/core/cli/powershell
    2. https://stackoverflow.com/questions/69472240/asp-net-6-identity-sqlite-services-adddbcontext-how

    回應
    你可能會有興趣的文章:

    限會員,要發表迴響,請先登入