Docker
, .NET Core 3.1
, Synology
, MVC
, Oracle
本文由 Grok AI 協助編輯
本文假設讀者已完成第一篇「在 Synology NAS 的 Docker 環境中部署 .NET Core 3.1 應用程式」的步驟,並將進一步介紹 Oracle 資料庫整合的開發與部署流程。我們將使用一個簡單的「書籍清單」範例來說明。
在第一篇文章中,我們部署了一個基本的 ASP.NET Core 3.1 MVC 應用程式(SimpleWeb
),包含預設的首頁和隱私頁面。本文將擴展此應用程式,新增一個「書籍清單」功能:
此功能將透過新增控制器、模型和資料庫上下文實現,並最終部署至 Synology NAS 的 Docker 環境。
完成本部分後,專案的檔案結構如下:
在 Visual Studio 2019 中,打開 SimpleWeb
專案,透過「工具 > NuGet 套件管理員 > 管理解決方案的 NuGet 套件」安裝以下套件:
Oracle.EntityFrameworkCore
(版本與 .NET Core 3.1 相容,例如 3.19.0)。Microsoft.EntityFrameworkCore
(版本 3.1.x,例如 3.1.10)。或者,在專案根目錄下使用命令列:
新增模型:
Models
資料夾中新增 Book.cs
:
建立 Data
資料夾與 OracleDbContext
:
Data
的資料夾。Data
資料夾中新增 OracleDbContext.cs
:
Data
資料夾與 OracleDbContext
的用途解釋Data
資料夾:
Data
資料夾的作用是集中管理與 Oracle 資料庫交互的類別,使專案結構更清晰。它分離了模型(Models
資料夾)和控制器(Controllers
資料夾),遵循 MVC 架構的關注點分離原則。OracleDbContext
的用途:
OracleDbContext
是 Entity Framework Core(EF Core)中的一個類別,繼承自 DbContext
,用於管理與 Oracle 資料庫的連線和資料操作。DbSet<Book> Books
屬性,應用程式可以直接操作 BOOKS
表格的資料。OracleDbContext
接收 DbContextOptions<OracleDbContext>
,這是用來配置連線字串和其他資料庫設定的參數(稍後在 Startup.cs
中設定)。編輯 appsettings.json
:
appsettings.json
中新增連線字串:
<user>
、<password>
、<oracle_host>
、<port>
和 <service_name>
替換為實際值。例如:"User Id=scott;Password=tiger;Data Source=192.168.1.100:1521/ORCL"
。編輯 Startup.cs
:
ConfigureServices
方法中註冊資料庫上下文:
BooksController
:
Controllers
資料夾中新增 BooksController.cs
:
Views/Books
資料夾中新增 Index.cshtml
:
以下是訪問 http://<NAS_IP>:62005/Books
時的模擬網頁輸出(假設已新增兩本書並包含初始化資料):
當使用者按下「Add Book」按鈕時,會觸發以下流程:
表單提交:
/Books/Add
,攜帶表單資料:
路由處理:
/Books/Add
)和 HTTP 方法(POST),將請求導向 BooksController.Add
方法。模型綁定(Model Binding):
Add
方法的參數 string title
和 string author
與表單的 <input name="title">
和 <input name="author">
名稱一致。title
的值 ("To Kill a Mockingbird") 綁定到 title
參數,author
的值 ("Harper Lee") 綁定到 author
參數。string titleName, string authorName
,但表單仍使用 name="title"
和 name="author"
,則綁定失敗,titleName
和 authorName
會收到 null
。<input name="titleName">
和 <input name="authorName">
,或使用 [FromForm(Name = "title")]
屬性明確指定綁定來源。控制器執行:
var book = new Book { Title = title, Author = author };
創建一個新的 Book
物件,Title
和 Author
分別設為 "To Kill a Mockingbird" 和 "Harper Lee"。_oracleDbContext.Books.Add(book)
將 book
加入資料庫上下文,標記為待新增。_oracleDbContext.SaveChanges()
生成並執行 SQL:
book.Id
。RedirectToAction("Index")
重新導向至 /Books
,觸發 Index
方法顯示更新後的清單。資料庫交互:
appsettings.json
或環境變數)與 Oracle 資料庫通訊,完成資料插入。頁面更新:
Index
頁面,顯示包含新書籍的清單。由於使用了 Oracle 資料庫,需確保 Dockerfile 包含必要的依賴。以下是更新後的 Dockerfile
:
libaio1
和 NLS_LANG
配置,確保容器內可連線 Oracle 資料庫。Dockerfile
儲存至 /volume1/docker/dotnet-runtime/
。Build Dotnet Runtime
任務(或重新執行 sh /volume1/docker/dotnet-runtime/build.sh
)。dotnet-runtime:3.1
已更新。在 Oracle 伺服器上建立表格:
在 Visual Studio 中:
SimpleWeb
專案,選擇「發佈」。./publish
。或者,使用命令直接發佈至 NAS:
若未使用命令直接發佈,手動將 ./publish
目錄上傳至 /volume1/docker/mywebapp/
。若已使用命令,則檔案已位於 NAS 的共享路徑。
為提高安全性,可將連線字串從 appsettings.json
移至環境變數:
appsettings.json
中的連線字串:
appsettings.json
,移除或註解掉 ConnectionStrings
部分:
ConnectionStrings__Oracle
User Id=<user>;Password=<password>;Data Source=<oracle_host>:<port>/<service_name>
(例如 User Id=scott;Password=tiger;Data Source=192.168.1.100:1521/ORCL
)。ConnectionStrings__Oracle
,並映射到 Configuration.GetConnectionString("Oracle")
,確保應用程式能正常連線。dotnet-runtime:3.1
。simpleweb-container
。62005
,容器端口 5000
。/volume1/docker/mywebapp/
,容器路徑 /app
。ConnectionStrings__Oracle
。dotnet /app/SimpleWeb.dll
。http://<NAS_IP>:62005/Books
查看書籍清單。Oracle 連線失敗:
appsettings.json
或環境變數中的連線字串是否正確。資料庫操作異常:
libaio1
已正確安裝於容器中。本文展示了如何為 .NET Core 3.1 應用程式整合 Oracle 資料庫,並成功部署至 Synology NAS 的 Docker 環境。基於第一篇的基礎,讀者現在可以處理基本的 Oracle 資料庫操作,並根據需求進一步擴展功能。