實體框架 (EF) 旨在根據模型類名稱表示單一實體的約定自動對錶名稱進行複數化。但是,在某些情況下,您可能會遇到差異,EF 建立複數表名稱,而模型或視圖需要單數名稱。
問題:
提供的程式碼定義了一個名為 Vote 的模型,並期望 MySQL 中有一個名為「vote」的表。但是,EF 而是建立了一個名為「votes」的表。嘗試從檢視存取表時,發生異常,指示「投票」表不存在。
可能的原因:
MySQL .NET 連接器可能不完全支援 EF 的表名複數約定。
解決方案:
要解決此問題,您可以在 EF 中自訂表名複數行為。步驟如下:
1.自訂 OnModelCreating 方法:
在 DbContext 類別中,重寫 OnModelCreating 方法並停用 PluralizingTableNameConvention。
<code class="csharp">protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); }</code>
2.刪除初始資料庫建立:
實體框架初始化程序可用於建立和初始化資料庫。但是,MySQL 的 .NET Connector 可能不允許 EF 建立資料庫。為了防止此問題,請確保資料庫在 EF 嘗試建立資料庫之前存在。
<code class="csharp">// Remove database creation initializer // Database.SetInitializer(new DropCreateDatabaseAlways<myDB>());</code>
3.停止基本模型建立呼叫:
確保不呼叫OnModelCreating 的基本實現,因為它可能會覆蓋您的自訂並重新啟用表名複數。
<code class="csharp">// Don't call the base implementation // base.OnModelCreating(modelBuilder);</code>
4。如果不存在則建立資料庫:
如果資料庫不存在,請手動建立。這樣可以確保 EF 可以使用正確的表名,而不會遇到缺少表的異常。
其他提示:
按照以下步驟,您應該能夠解決表名複數問題差異問題並成功存取您視圖中的「投票」表。
以上是當我的模型需要單數名稱時,為什麼實體框架會在 MySQL 中使用複數表名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!