iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
佛心分享-SideProject30

30天的旅程!從學習C#到開發小專案系列 第 20

DAY 20 - 建立User Table + 連接Neon 資料庫

  • 分享至 

  • xImage
  •  

哈囉大家好!
昨天的GSI按鈕登入功能完成後,要來把前端接收到的JWT存到資料庫中。
我選擇用關聯式資料庫PostgreSQL來儲存資料,使用的是Neon這個Serverless(無伺服器)PostgreSQL資料庫,有提供免費的額度~
Neon的優勢是:當資料庫閒置時會自動暫停,可以節省運行成本,並且支援資料庫分支(Branching)。

建立C# ASP.NET Core MVC API專案

首先要登入Neon, 並建立一個資料庫實例,取得連線資訊。

C#專案所需的NuGet套件

因為Neon使用的是PostgreSQL,所以需要安裝Entity Framework Core專門使用的PostgreSQL Provider。
建立好C# MVC API專案後,執行下面的命令來安裝需要的套件工具:

  1. 安裝核心Entity Framework Core:
dotnet add package Microsoft.EntityFrameworkCore
  1. 安裝Npgsql (PostgreSQL provider)
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
  1. 安裝EF Core工具(用於Migration)
dotnet add package Microsoft.EntityFrameworkCore.Tools

建立User Model + 溝通橋樑:DbContext(資料庫上下文)

接下來要先建立一個DbContext類別,負責EF Core和資料庫的溝通。
因為接下來要儲存的是User的相關資訊,所以我先建立一個User的Model(即User表格需要的欄位)

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace GoDutch.Models
{
    [Table("Users")]
    public class User
    {
        [Key] // primary key
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)] // auto-increment
        public int Id { get; set; }

        [Required]
        public string GoogleSubId { get; set; } = string.Empty; // Google Sub ID

        [Required]
        public string Email { get; set; } = string.Empty;

        public string Name { get; set; } = string.Empty;

        // 首次建立時間
        public DateTime CreatedAt { get; set; } = DateTime.Now; 
    }
}

接著就可以建立DbContext(要記得設定DbSet來對應資料表):

using GoDutch.Models;
using Microsoft.EntityFrameworkCore;

namespace GoDutch.Data
{
    public class AppDbContext : DbContext
    {
        // 這裡定義資料模型(entity)
        public DbSet<User> Users { get; set; }

        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            // 為GoogleSubId建立索引,加快查找速度
            modelBuilder.Entity<User>()
                .HasIndex(u => u.GoogleSubId)
                .IsUnique();
        }
    }
}

配置資料庫連接字串(Connection String)和服務

接下來要在appsettings.json檔中新增Neon提供的資料庫連接字串:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "NeonPostgresConnection": "Host=我的neon Host;Port=5432;Database=資料庫名稱;Username=使用者名稱;Password=密碼;Include Error Detail=true"
  }
}

註:Connection String需要填寫的資訊(例如:Host, Database名稱, Username, Password等)都可以在資料庫設定裡面查看

最後要將服務初始化,所以要在專案的入口點(Program.cs)配置EF Core使用Npgsql來驅動連接Neon:

using Microsoft.EntityFrameworkCore;
using GoDutch.Data;
using System.Text.Json.Serialization;

var builder = WebApplication.CreateBuilder(args);

// 配置Connection String
var connectionString = builder.Configuration.GetConnectionString("NeonPostgresConnection") 
                       ?? throw new InvalidOperationException("Connection string 'NeonPostgresConnection' not found.");

// 配置 AppDbContext
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseNpgsql(connectionString));

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

完成後就可以透過指令來建立migration:

dotnet ef migrations add CreateTableUser

註:這裡一開始執行指令時,出現了「因為找不到指定的命令或檔案,所以無法執行。」的錯誤訊息。
上網查了一下發現從 3.0 起,EF Core 命令列工具 (dotnet ef) 不再包含於 .NET Core SDK 裡,必須額外安裝。
安裝指令為 dotnet tool install --global dotnet-ef

再update到資料庫:

dotnet ef database update

接著 do re mi so!
就可以在Neon介面看到資料表了(如圖示!)
https://ithelp.ithome.com.tw/upload/images/20251004/201689860QyzUnuovp.png


上一篇
DAY 19 - Google SignIn Button 登入功能
下一篇
DAY 21 - 取得ID Token後,User資料發送到後端驗證儲存
系列文
30天的旅程!從學習C#到開發小專案24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言