實體框架和手動分配的鍵:故障排除指南
使用實體框架的程式碼優先方法時的一個常見挑戰是框架傾向於自動遞增鍵,即使鍵是手動分配的。 本文詳細介紹了解決方案及其潛在陷阱。
一位開發者最近遇到了這個問題。 儘管明確設定鍵值,實體框架仍繼續自動遞增。 典型的解決方案,使用 HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
:
<code class="language-csharp">modelBuilder.Entity<event>().Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);</code>
...導致以下錯誤:
<code>Unhandled Exception: System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. --- System.Data.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'Events' when IDENTITY_INSERT is set to OFF.</code>
出現此錯誤的原因是「事件」表的 IDENTITY_INSERT
設定為 OFF。 要解決此問題,在使用手動指定的鍵插入資料之前,必須將 IDENTITY_INSERT
明確設定為 ON 。 這允許資料庫接受預先分配的鍵值。
<code class="language-csharp">[Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int EventID { get; set; }</code>此方法在 Entity Framework 和 Entity Framework Core 中皆有效。 關鍵是要正確管理資料庫的
設置,以避免手動分配主鍵值時發生衝突。 請記住在插入完成後將其設定回 OFF 以實現標準資料庫行為。 IDENTITY_INSERT
以上是為什麼即使手動指定,實體框架也會自動遞增鍵?的詳細內容。更多資訊請關注PHP中文網其他相關文章!