在实体框架中抑制自动主键生成
实体框架的代码优先方法通常会自动生成主键,特别是自动递增标识列。 这种自动行为并不总是合适的。 本文概述了如何覆盖此默认功能。
一种常见方法使用流畅的 API 配置:
<code class="language-csharp">modelBuilder.Entity<Event>().Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);</code>
但是,这可能会导致错误:“当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Events”中插入标识列的显式值。”
理解错误
此错误是由冲突引起的。 DatabaseGeneratedOption.None
阻止 EF 生成 ID,但数据库表仍然拥有 IDENTITY
属性,在尝试手动分配键值时会产生冲突。
分辨率
解决方案涉及禁用数据库中 ID 列的 IDENTITY
属性。 使用此 SQL 命令:
<code class="language-sql">ALTER TABLE Events ALTER COLUMN EventID INT NOT NULL</code>
基于属性的替代方案
或者,您可以直接在实体类中使用属性:
<code class="language-csharp">[Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int EventID { get; set; }</code>
此方法在 EF Core 中也能正常运行。
通过实施这些解决方案,开发人员可以控制主键分配、手动指定值并绕过 EF 的默认自动生成。
以上是如何防止实体框架自动生成主键?的详细内容。更多信息请关注PHP中文网其他相关文章!