无法首先在表 ef6 db 中插入标识列的显式值

Posted

技术标签:

【中文标题】无法首先在表 ef6 db 中插入标识列的显式值【英文标题】:Cannot insert explicit value for identity column in table ef6 db first 【发布时间】:2021-08-21 21:53:06 【问题描述】:

在使用 c# + 实体框架 6(数据库优先) + sql server 创建应用程序时,我遇到了下一个问题:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“Qualification”中的标识列插入显式值。

我尝试用谷歌搜索我的问题,最流行的答案就是为模型添加属性

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

但这无济于事。 然后我决定运行 SQL 命令“SET IDENTITY_INSERT dbo.Qualification ON”,但它也没有帮助。 在我的数据库中(我使用管理工作室)身份规范(是身份)设置为 TRUE

有我的.NET 生成的实体:

public partial class Qualification

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Qualification()
    
        this.Trainer = new HashSet<Trainer>();
    

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id  get; set; 
    public string Name  get; set; 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Trainer> Trainer  get; set; 

还有我的上下文类:

 public partial class SportClubContext : DbContext

    public SportClubContext()
        : base("name=SportClubContext")
    
        
    

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        throw new UnintentionalCodeFirstException();
    

    public virtual DbSet<sysdiagrams> sysdiagrams  get; set; 
    public virtual DbSet<Client> Client  get; set; 
    public virtual DbSet<Group> Group  get; set; 
    public virtual DbSet<Qualification> Qualification  get; set; 
    public virtual DbSet<Schedule> Schedule  get; set; 
    public virtual DbSet<Trainer> Trainer  get; set; 
    public virtual DbSet<Training> Training  get; set; 

以及我如何尝试将新记录添加到我的数据库:

var qualification = new Qualification
        
            Name = textBox1.Text
        ;

context.Qualification.Add(qualification);
await context.SaveChangesAsync();

【问题讨论】:

我认为您尝试执行此操作的方式没有任何问题...您的错误表明您正在尝试将值插入定义为身份的字段中,但是如果您的插入代码是准确的,这是抛出错误的地方,我不知道为什么会出错。 【参考方案1】:

在 ID 列上使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 时,它应该会插入没有该错误的行。接下来要检查的是,您的 Qualification 表中的标识列实际上称为“Id”,而不是“QualificationId”之类的名称。 (检查列的名称,该列实际上是表中设置为“Identity”的列)

还要检查在添加该属性并运行之后,您是否已经重建了整个解决方案(如果您的项目结构没有使用直接依赖项,而是使用松散耦合的 Web 服务),并且您仍然收到的任何异常都是身份资格表上的相关问题,而不是 不同 例外。 (那个让我在一段时间内遇到相同的异常并尝试不同的方法来修复它之后,我正在追逐一个已修复的原始问题,现在它是其他东西在同一个地方导致异常,但不同的消息。)

【讨论】:

以上是关于无法首先在表 ef6 db 中插入标识列的显式值的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 出现错误“无法在表中插入标识列的显式值”

当 IDENTITY_INSERT 设置为 OFF 时,无法在表“企业”中插入标识列的显式值

当 IDENTITY_INSERT 设置为 OFF 时,无法在表中插入标识列的显式值

当 IDENTITY_INSERT 设置为 OFF 时,SQL 无法在表“表”中插入标识列的显式值 [重复]

SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“任务”中插入标识列的显式值

当 IDENTITY_INSERT 设置为 OFF 时,无法在表“tbl Fingerprint”中插入标识列的显式值 [重复]