首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

VS2012/2013/2015/2017/2019/2022 EF Designer 代碼生成策略切換:從 None 到 Default 修復實體無法實例化

     編輯:ASP.NET 基礎

現象

升級 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 檔,即導致無代碼可用。

圖解修復步驟 (適用 VS2012~VS2022)

  1. 雙擊 Model.edmx 開啟設計介面。
  2. 點擊空白處 (無實體被選取),開啟 屬性視窗 (F4)。
  3. 找到 Code Generation Strategy,將值從 None 改為 Default (或 T4 若想用模板)。
  4. 在方案總管中,展開 Model.edmx,刪除 Model.tt 與 Model.Context.tt (若存在)。
  5. 右鍵專案 → 重新建置 (或 Ctrl+Shift+B)。
  6. 確認 Model.Designer.cs 重新生成,包含實體類別、ObjectContext/DBContext 衍生類別。

進階:改用 T4 模板 (推薦長期維護)

Code Generation Strategy = T4 時,保留 .tt 檔,可自訂:

  • 實體類別繼承基類 (如 EntityBase 含 Id/CreatedAt)
  • 屬性加上 [DataMember]/[JsonProperty]
  • 導航屬性改為 virtual 支援 Lazy Loading Proxy
  • 生成 DbContext 而非 ObjectContext (EF 6+ 標準)

標準 EF 6.x T4 模板可從 NuGet 安裝:EntityFramework.Templates 或直接從 EF6 GitHub 下載 DbContext.tt、Entity.tt 覆蓋專案內 .tt 檔。

遷移至 EF Core / .NET 6+ 的建議

.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
關聯導航屬性為 nullLazy Loading 未啟用 / 未標 virtual / Proxy 建立失敗Context.Configuration.LazyLoadingEnabled = true;實體類別屬性加 virtual
編譯錯誤:型別重複定義同時存在 Designer.cs 與 .tt 產生的檔案刪除其一,建議保留 .tt 方案

總結

EF Designer 代碼生成策略切換是「升級 VS 後實體消失」的首因。三步驟修復:屬性改 Default → 刪 .tt → 重建。長期專案請轉向 T4 模板客製化 或 EF Core Code First,擁抱原始碼優先、無設計介面依賴的現代開發模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved