# .net 8 WebAPI+Postgresql ###### tags: `.NET Core` `.net8` `Postgresql` ## 建立專案 在 Visual Studio Code 環境中建立一個 .NET Core 8.0 RESTful API 專案,並使用 Entity Framework Core (EF Core) 與 PostgreSQL 整合,同時建立 ControllerBase,包含 CRUD 功能的步驟: ### 步驟 1:建立 .NET Core RESTful API 專案 首先,在終端機中使用以下命令建立一個 .NET Core RESTful API 專案: ``` bash= dotnet new webapi -n MyApi ```` :::info **MyApi**: .NET Core Web API 專案名稱,可依需求自行修改。 ::: ### 步驟 2:安裝 Entity Framework Core 套件 進入專案目錄,並使用以下命令安裝 Entity Framework Core 套件: ``` bash= cd MyApi dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson ```` 這將安裝 EF Core 和 PostgreSQL 整合套件。 ### 步驟 3:建立資料庫模型類別 定義你的資料庫模型類別。例如,你可以建立一個 User 類別表示用戶: ``` csharp= using System.ComponentModel.DataAnnotations; public class User { [Key] public int Id { get; set; } [Required] public string Username { get; set; } [Required] public string Email { get; set; } } ```` ### 步驟 4:設置資料庫連線字串 在 appsettings.json 檔案中設置 PostgreSQL 資料庫的連線字串,例如: ````json= { "ConnectionStrings": { "DefaultConnection": "Host=myhost;Port=myport;Database=mydatabase;Username=myuser;Password=mypassword;" } } ```` ### 步驟 5:建立 DbContext 建立一個繼承自 DbContext 的類別,並設置資料庫連線字串,並在其中定義資料庫表的映射: ``` csharp= using Microsoft.EntityFrameworkCore; public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<User> Users { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 可以在這裡進行資料庫表的配置 } } ```` ### 步驟 6:建立 ControllerBase 建立一個繼承自 ControllerBase 的控制器,並實現 CRUD 操作: ``` csharp= using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Linq; [ApiController] [Route("api/[controller]")] public class UsersController : ControllerBase { private readonly ApplicationDbContext _context; public UsersController(ApplicationDbContext context) { _context = context; } [HttpGet] public ActionResult<IEnumerable<User>> Get() { return _context.Users.ToList(); } [HttpGet("{id}")] public ActionResult<User> Get(int id) { var user = _context.Users.Find(id); if (user == null) { return NotFound(); } return user; } [HttpPost] public ActionResult<User> Post(User user) { _context.Users.Add(user); _context.SaveChanges(); return CreatedAtAction(nameof(Get), new { id = user.Id }, user); } [HttpPut("{id}")] public IActionResult Put(int id, User user) { if (id != user.Id) { return BadRequest(); } _context.Entry(user).State = EntityState.Modified; _context.SaveChanges(); return NoContent(); } [HttpDelete("{id}")] public IActionResult Delete(int id) { var user = _context.Users.Find(id); if (user == null) { return NotFound(); } _context.Users.Remove(user); _context.SaveChanges(); return NoContent(); } } ```` ### 步驟 7:Program.cs修改 ```` csharp= using Microsoft.EntityFrameworkCore; // 引入 Entity Framework Core 命名空間 var builder = WebApplication.CreateBuilder(args); // Add services to the container. // 將 API Explorer 服務添加到依賴注入容器中。 builder.Services.AddEndpointsApiExplorer(); // 將 Swagger 生成器服務添加到依賴注入容器中。 builder.Services.AddSwaggerGen(); // 將控制器服務添加到依賴注入容器中。這將允許 ASP.NET Core MVC 使用控制器來處理 HTTP 請求。 builder.Services.AddControllers(); // 從應用程式設定中獲取連接字串。 var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); // 將 ApplicationDbContext 服務添加到依賴注入容器中,並配置使用 Npgsql 作為資料庫提供程序。 builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseNpgsql(connectionString)); // 獲取 ApplicationDbContext 實例,並確保資料庫已創建。 builder.Services.BuildServiceProvider().GetService<ApplicationDbContext>().Database.EnsureCreated(); var app = builder.Build(); // Configure the HTTP request pipeline. // 配置 HTTP 請求管道。 if (app.Environment.IsDevelopment()) { // 如果應用程式正在開發模式下運行,則使用 Swagger 和 Swagger UI。 app.UseSwagger(); app.UseSwaggerUI(); } // 將 HTTP 請求重定向到 HTTPS。 app.UseHttpsRedirection(); // 使用授權中間件。 app.UseAuthorization(); // 將路由映射到控制器動作。 app.MapControllers(); // 啟動應用程式。 app.Run(); ```` ### 步驟 8:啟動應用程式 在終端機中使用以下命令啟動應用程式: ``` bash= dotnet run ```` --- ## DbContext ### DbContext 的重要概念和功能: 1. **定義資料庫模型**: - DbContext 允許你定義應用程式中的資料庫模型,通常對應於資料庫中的表格和欄位。你可以使用 C# 類別來定義這些模型。 2. **建立資料庫上下文**: - DbContext 是表示資料庫的上下文,包含了應用程式與資料庫之間的所有對話和交互。每個資料庫通常有一個對應的 DbContext 類別。 3. **資料庫初始化**: - DbContext 負責初始化資料庫的連線,並在需要時自動打開、關閉連線。你可以使用 DbContext 實例執行資料庫操作。 4. **實現單元操作模式**: - DbContext 通常用於實現單元操作模式,允許將資料庫操作組合在一起作為一個單元進行處理,並一次性提交到資料庫。 5. **支援資料庫遷移**: - EF Core 提供資料庫遷移功能,可以根據 C# 實體類別的變更自動更新資料庫架構。DbContext 負責管理這些遷移。 6. **提供 LINQ 查詢**: - DbContext 提供對 LINQ(Language-Integrated Query)的支援,使得你可以使用類似於 SQL 的語法來編寫資料庫查詢。 ### 結論 DbContext 是 EF Core 中的一個重要類別,負責管理應用程式與資料庫之間的交互,並提供了方便的方法來定義資料庫模型、執行資料庫操作和管理資料庫遷移。 ### DbContext通常歸類在哪一個資料夾? 在 .NET Core 專案中,通常將 DbContext 類別放在資料存取層(Data Access Layer)中的特定資料夾中。這個資料夾通常稱為 Data、DataAccess、Repositories 或類似的名稱,視專案結構和命名慣例而定。 以下是一個典型的 .NET Core 專案結構示例,其中包含了 DbContext: ``` bash= MyProject/ │ ├── MyProject/ │ ├── Controllers/ │ ├── Data/ │ │ ├── ApplicationDbContext.cs <-- DbContext 通常位於這裡 │ │ └── Migrations/ │ ├── Models/ │ ├── Services/ │ └── appsettings.json └── ... ```` Data 資料夾用於存放與資料存取相關的類別,包括 DbContext、資料庫模型類別、資料庫遷移(Migrations)等。這樣可以更清晰地組織代碼,讓每個部分的職責更明確。 ### 資料模型自動創建或更新資料庫表格 EF Core 提供了一種自動遷移的機制,可以讓你根據資料模型自動創建或更新資料庫表格。這種方式比 EnsureCreated 方法更具彈性,因為它可以應對資料庫結構的變更,並生成相應的遷移。 要使用遷移,可以執行以下步驟: 1. 在資料模型發生變更後,創建一個新的遷移。可以使用以下命令創建一個新遷移: ```` bash= dotnet ef migrations add YourMigrationName ```` 這將創建一個新的 C# 類別,該類別包含了對資料模型的變更描述。 2. 將新的遷移應用到資料庫。可以使用以下命令應用新遷移: ```` bash= dotnet ef database update ```` 這將自動將資料模型的變更應用到資料庫中,包括創建新的表格或更新現有的表格。 使用遷移的好處是可以在資料模型發生變更時,自動更新資料庫結構,而不需要手動執行 SQL 腳本。這樣可以使開發過程更加順暢且容易管理。