升級 Visual Studio 或遷移專案後,Entity Framework Designer (.edmx) 產生的實體類別無法 `new`、屬性為空、導航屬性不載入、ObjectContext 找不到型別。錯誤訊息常見:The type 'MyEntity' is not mapped as a structural type 或運行時靜默失敗。
VS 2012+ 引入 Code Generation Strategy 屬性,預設值從 Default (產生 EntityObject/POCO + ObjectContext) 改為 None (僅產生 .edmx XML,不產生 .cs),配合 T4 模板 (.tt) 由開發者自行控制代碼生成。若專案遷移時未同步調整此屬性,或誤刪 .tt 檔,即導致無代碼可用。
None 改為 Default (或 T4 若想用模板)。Code Generation Strategy = T4 時,保留 .tt 檔,可自訂:
EntityBase 含 Id/CreatedAt)[DataMember]/[JsonProperty]virtual 支援 Lazy Loading ProxyDbContext 而非 ObjectContext (EF 6+ 標準)標準 EF 6.x T4 模板可從 NuGet 安裝:EntityFramework.Templates 或直接從 EF6 GitHub 下載 DbContext.tt、Entity.tt 覆蓋專案內 .tt 檔。
.edmx / Designer 屬於 僅維護模式,新專案請直接採用 EF Core + Code First + 遷移:
// 1. 安裝套件
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
// 2. 反向工程現有資料庫產生實體與 DbContext
Scaffold-DbContext "Server=.;Database=MyDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities -Context MyDbContext -f
// 3. 後續變更用 Migration
Add-Migration InitialCreate
Update-Database
優點:無設計介面依賴、跨平台、原始碼即模型、支援 LINQ 查詢翻譯優化、效能更好。
| 問題 | 原因 | 解決 |
|---|---|---|
| 實體類別找不到 | Code Generation Strategy = None 且無 .tt | 改為 Default 或恢復 .tt 重建 |
| MetadataException: Unable to load the specified metadata resource | 連接字串中 res://*/Model.csdl 路徑錯誤 | 檢查 .edmx 檔案屬性 Build Action = EntityDeploy,Copy to Output Directory = Copy if newer |
| 關聯導航屬性為 null | Lazy Loading 未啟用 / 未標 virtual / Proxy 建立失敗 | Context.Configuration.LazyLoadingEnabled = true;實體類別屬性加 virtual |
| 編譯錯誤:型別重複定義 | 同時存在 Designer.cs 與 .tt 產生的檔案 | 刪除其一,建議保留 .tt 方案 |
EF Designer 代碼生成策略切換是「升級 VS 後實體消失」的首因。三步驟修復:屬性改 Default → 刪 .tt → 重建。長期專案請轉向 T4 模板客製化 或 EF Core Code First,擁抱原始碼優先、無設計介面依賴的現代開發模式。