Entity Framework Core(一)
本篇文將介紹用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 = $" [email protected]", 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




















