github Source code

在之前的筆記中 使用 .NET 6.0 進行 JWT 身份驗證的 ASP.NET Web Api 已仔細的紀錄如何使用 .Net 6.0 來建置一個支援 JWT & Identity framework 的 WebApi 網站應用程式,在該篇筆記中所使用的資料庫是 MS SQL 2019,而這篇筆記裡將紀錄如何將它改成支援 PostgresSQL。

若你還沒有安裝 PostgresSQL 可以參考這筆記先將資料庫管理系統備妥 使用 Docker 執行 PostgresSQL 與 pgAdmin

專案完成後的檔案結構

./專案目錄
├── .config/
│   └── dotnet-tools.json
├── .vscode/
│   ├── launch.js
│   └── tasks.json
├── Controller/
│   ├── AuthenticateController.cs
│   ├── TodoController.cs
│   └── WeatherForecast.cs
├── Data/
│   └── ApiDbContext.cs
├── Migrations/
├── Models/
│   ├── AuthenticateData.cs
│   └── ItemData.cs
├── obj/
├── Properties/
│   └── launchSettings.json
├── .gitignore
├── appsettings.Development.json
├── appsettings.json
├── dotnet6-webapi-jwt.csproj
├── global.json
├── Program.cs
├── README.md
└── WeatherForecast.cs

專案完成後所提供的 API 端點

Methods Urls Actions
POST /api/Authenticate/login 註冊新使用者帳號
POST /api/Authenticate/register 使用者帳號登入
POST /api/Authenticate/register-admin 管理者帳號登入
GET /api/Todos get all Todos
POST /api/Todos add New Todo
GET /api/Todos/:id get Todo by id
PUT /api/todos/:id update Todo by id
DELETE /api/todos/:id remove Todo by id

git clone Example Code

先 git clone `使用 .NET 6.0 進行 JWT 身份驗證的 ASP.NET Web Api。並使用 Microsoft Identity 框架來存儲使用者和角色等資料` 這篇筆記的 Source code

$ git clone https://github.com/calvinegs/dotnet6-webapi-jwt.git dotnet6-webapi-postgress

restore 相依的套件

$ cd dotnet6-webapi-postgress

$ dotnet restore

  正在判斷要還原的專案...
  已還原 /home/egs/cal-data/tech-test/webapi/test/dotnet6-webapi-postgress/dotnet6-webapi-jwt.csproj (1.12 sec 內)

安裝及使用 Postgres 相關套件

$ dotnet remove package Microsoft.EntityFrameworkCore.SqlServer
info : 正在從專案 '/home/egs/cal-data/tech-test/webapi/test/dotnet6-webapi-postgress/dotnet6-webapi-jwt.csproj' 中移除套件 'Microsoft.EntityFrameworkCore.SqlServer' 的 PackageReference。

$ dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
  正在判斷要還原的專案...
  Writing /tmp/tmpU1vZfj.tmp
info : 正在將套件 'Npgsql.EntityFrameworkCore.PostgreSQL' 的 PackageReference 新增至專案 '/home/egs/cal-data/tech-test/webapi/test/dotnet6-webapi-postgress/dotnet6-webapi-jwt.csproj'。
info :   GET https://api.nuget.org/v3/registration5-gz-semver2/npgsql.entityframeworkcore.postgresql/index.json
info :   OK https://api.nuget.org/v3/registration5-gz-semver2/npgsql.entityframeworkcore.postgresql/index.json 858 毫秒
info : 正在還原 /home/egs/cal-data/tech-test/webapi/test/dotnet6-webapi-postgress/dotnet6-webapi-jwt.csproj 的封裝...
info : 套件 'Npgsql.EntityFrameworkCore.PostgreSQL' 與專案 '/home/egs/cal-data/tech-test/webapi/test/dotnet6-webapi-postgress/dotnet6-webapi-jwt.csproj' 中的所有架構相容。
info : 已將套件 'Npgsql.EntityFrameworkCore.PostgreSQL' 版本 '6.0.4' 的 PackageReference 新增至檔案 '/home/egs/cal-data/tech-test/webapi/test/dotnet6-webapi-postgress/dotnet6-webapi-jwt.csproj'。
info : 正在將資產檔案寫入磁碟。路徑: /home/egs/cal-data/tech-test/webapi/test/dotnet6-webapi-postgress/obj/project.assets.json
log  : 已還原 /home/egs/cal-data/tech-test/webapi/test/dotnet6-webapi-postgress/dotnet6-webapi-jwt.csproj (371 ms 內)

使用 VSCode 開啟專案

$ code .

開啟 dotnet6-webapi-jwt.csproj 專案檔可發現已採用 `Npgsql.EntityFrameworkCore.PostgreSQL`套件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <RootNamespace>dotnet6_webapi_jwt</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.5" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.5" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.5">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.5">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.5" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.4" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
  </ItemGroup>

</Project>

修改 DbContext 參數

修改 Program.cs 中 DbContext 的參數設定

builder.Services.AddDbContext<ApiDbContext>(
    options => options.UseSqlServer(
        _configuration.GetConnectionString("ConnStr")
    )
);

改成

builder.Services.AddDbContext<ApiDbContext>(
    options => options.UseNpgsql(
        _configuration.GetConnectionString("ConnStr")
    )
);

修改 appsettings.json 中的 Conection String

  "ConnectionStrings": {
    "ConnStr": "Data Source=localhost;Initial Catalog=TestDB;User ID=SA;Password=Sql@12345"
  },

改成

  "ConnectionStrings": {
    "ConnStr": "User ID =docker;Password=docker;Server=localhost;Port=5432;Database=pg_testdb; Integrated Security=true;Pooling=true"
  },

將原有專案的 Migrations 子目錄移除

$ rm -f ./Migrations

$ dotnet build # 重新建置程式
Microsoft (R) Build Engine for .NET 17.2.0+41abc5629 版
Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。

  正在判斷要還原的專案...
  所有專案都在最新狀態,可進行還原。
  dotnet6-webapi-jwt -> /home/egs/cal-data/tech-test/webapi/test/dotnet6-webapi-postgress/bin/Debug/net6.0/dotnet6-webapi-jwt.dll

建置成功。
    0 個警告
    0 個錯誤

經過時間 00:00:02.21

新增一個資料遷移

$ dotnet ef Migrations add "Initial Migrations"
Build started...
Build succeeded.
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 6.0.5 initialized 'ApiDbContext' using provider 'Npgsql.EntityFrameworkCore.PostgreSQL:6.0.4+6cb649128e3e7aa8eddd77dfa75b34bad51e6e94' with options: None
Done. To undo this action, use 'ef migrations remove'

將資料遷移更新至資料庫

$ dotnet ef database update

![2022-06-02 18-07-55](https://user-images.githubusercontent.com/21993717/171607590-cd6e06ad-7ae7-47d2-bfba-afe9aab0d11e.png)

資料遷移成功後會在資料庫中自動産生 Identity Framework 所使用的資料表,而自定的 Model 也會一併産生新資料表

2022-06-02 18-07-55

執行結果

2022-06-02 18-15-28