# .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 整合套件。
:::info
補充說明:
| DB | 套件 |
| -------- | -------- |
|SQL Server | Microsoft.EntityFrameworkCore.SqlServer|
|PostgreSQL | Npgsql.EntityFrameworkCore.PostgreSQL|
|MySQL,MariaDB | Pomelo.EntityFrameworkCore.MySql|
|SQLite | Microsoft.EntityFrameworkCore.SQLite|
|SQL Compact | EntityFrameworkCore.SqlServerCompact40|
|In-memory | Microsoft.EntityFrameworkCore.InMemory|
:::
### 步驟 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 方法更具彈性,因為它可以應對資料庫結構的變更,並生成相應的遷移。
要使用遷移,可以執行以下步驟:
事前須確定開發環境有安裝dotnet-ef,若沒有請執行以下指令
```` bash=
dotnet tool install --global dotnet-ef
````
1. 在資料模型發生變更後,創建一個新的遷移。可以使用以下命令創建一個新遷移:
```` bash=
dotnet ef migrations add YourMigrationName
````
這將創建一個新的 C# 類別,該類別包含了對資料模型的變更描述。
2. 將新的遷移應用到資料庫。可以使用以下命令應用新遷移:
```` bash=
dotnet ef database update
````
這將自動將資料模型的變更應用到資料庫中,包括創建新的表格或更新現有的表格。
使用遷移的好處是可以在資料模型發生變更時,自動更新資料庫結構,而不需要手動執行 SQL 腳本。這樣可以使開發過程更加順暢且容易管理。