本篇回顧實體模型從設計到落地的演進過程,分享開發過程中遇到的 Code First 遷移難題、Cookie 驗證機制探索、權限控制架構抉擇等實戰經驗。
專案啟動前,針對核心技術點進行 Spike 測試:
「先探路,後過兵」—— 預先驗證技術可行性,避免正式開發時被卡關。

| 原設計 | 調整後 | 理由 |
|---|---|---|
| User 表包含所有欄位 | 拆分 User(認證) + UserInfo(資料) | 登入高頻查詢輕量化、支援延遲載入 |
| School 使用 Id 主鍵 | School 使用 Name 天然主鍵 | 學校名稱唯一,減少 Join、簡化前端下拉綁定 |
| Class 使用複合主鍵 | Class 改用 Identity ClassId | EF 對複合鍵支援較弱、URL 路由更簡潔 |
| 多對多關聯建立中介實體 | 保留中介實體並豐富屬性 | 記錄加入時間、角色(幹部/成員)、審核狀態 |
初期使用 `Database.SetInitializer(new DropCreateDatabaseIfModelChanges
public partial class AddSchoolTable : DbMigration
{
public override void Up()
{
CreateTable(...);
// 種子資料
Sql("INSERT INTO Schools (Name) VALUES ('國立臺灣大學'), ('國立清華大學')");
}
public override void Down() { DropTable("Schools"); }
}
團隊協作時,遷移檔案(`Migrations/20240101120000_AddSchoolTable.cs`)必須 Commit,新成員 `Update-Database` 即可同步結構。
早期嘗試在 `Controller` 基底類別寫 `OnActionExecuting` 檢查 Session,但 `RedirectToAction` 導致新請求 Session 為空。
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
CheckPermission(filterContext);
base.OnActionExecuting(filterContext);
}
}
缺點:VS 建立 Controller 預設繼承 `Controller`,每次需手動改繼承 `BaseController`,違背慣例。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class RequireLoginAttribute : ActionFilterAttribute { ... }
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class RequireAdminAttribute : ActionFilterAttribute { ... }
優點:屬性裝飾式、符合 MVC 慣例、可精確控制到 Action 層級、不干擾 Controller 繼承鏈。
畢業專題雖小,但完整經歷了「需求→設計→預研→開發→遷移→部署」全生命週期,比單純 CRUD 練習收穫大得多。