本篇文將介紹用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