实体框架和手动分配的键:故障排除指南
使用实体框架的代码优先方法时的一个常见挑战是框架倾向于自动递增键,即使键是手动分配的。 本文详细介绍了解决方案及其潜在陷阱。
一位开发者最近遇到了这个问题。 尽管显式设置键值,实体框架仍继续自动递增。 典型的解决方案,使用 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中文网其他相关文章!