> ## Content Index
> Fetch the complete content index at: https://blog.anthea.day/llms.txt
> Use this file to discover other available public pages before exploring further.

# 歡迎來到 GIS 的世界－ Day 19：Npgsql With .NET
- URL: https://blog.anthea.day/series-2022-ithome-19/
- Published: 2022-10-02T16:02:29.000Z
- Updated: 2026-11-06T19:25:28.000Z
- Author: Anthea / 芫荽
- Tags: #Migrated-1792241843742, #Import 2026-10-17 12:57, Coding, 2022 iThome 鐵人賽：歡迎來到 GIS 的世界

最後在進入小專案之前，會分別介紹要如何在 .NET 和 .NET Framework 中和 PostgreSQL 進行溝通。這邊會選擇使用 Entity Framework 作為溝通的方法，介紹如何搭配 Npgsql 來和資料庫做連線。

#### EntityFrameworkCore

首先要介紹的是相對單純的 NET。因為沒有支援特殊的檔案格式 `.edmx`，不需要特別使用 Visual Stadio 才能使用，因此示範的 IDE 會是 Rider。以下是要安裝的 Nuget 套件：

![](https://cdn-images-1.medium.com/max/800/1*n4OiiZsEgFRpNFK5YG64Ww.png)

第二個套件的用途是讓我們可以利用 CLI 和資料庫建立連線，並且將 Tables 自動轉換成相對應的物件。第四個套件則是讓我們可以使用 NetTopologySuite 的型別，接取資料庫中型別為 geometry 的資料。

### 建立資料

這裡要使用的是 DB First 的方式，將資料引入，另外也有使用 Code First 的開發方式，但這裡就不贅述。

```C#
-- 第一次使用 EF CLI 的話請先安裝
-- dotnet tool install --global dotnet-ef
dotnet ef dbcontext scaffold "Host=localhost;Database=db_with_postgis;Username=postgres;Password=0000;" Npgsql.EntityFrameworkCore.PostgreSQL -o ./Models/Db -c MyContext -f
```

這裡有幾個參數要輸入：

1. 連線資訊：雙引號內的部分，包含主機、資料庫名稱、登入的使用者名稱和密碼，如果沒有特別設定的話，預設的使用者會是 postgres，密碼則是安裝流程中輸入的那一組
2. 連線的套件名稱：也就是上面安裝的套件中第三個，每種資料庫所輸入的名稱會略有不同
3. `-o`：指定生成的物件位置，不存在的話就會自動建立
4. `-c`：指定生成的 DbContext 名稱
5. `-f`：是否複寫之前的檔案

#### 設定 `Program.cs`

如果要使用 NetTopologySuite 來讀取 Geometry 類型的話，要記得在設定的地方加上 `UseNetTopologySuite()`：

```C#
builder.Services.AddDbContext<MyContext>(options => 
    options.UseNpgsql(builder.Configuration.GetConnectionString("Db"),
        s => s.UseNetTopologySuite()));
```

這樣基本上就完成和 PostgreSQL 的連線了，後續的使用方法和一般的 EntityFramework 相同，只是你可以直接把資料庫中 Geometry 的型別接出來，做出像 ST\_Within 等的操作而不需要仰賴資料庫連線。

#### References

- [Spatial Mapping with NetTopologySuite](https://www.npgsql.org/efcore/mapping/nts.html?q=UseNetTopologySuite&ref=blog.anthea.day)