【问题标题】:Cannot insert explicit value for identity insert ID manually entity when IDENTITY_INSERT is set to OFF当 IDENTITY_INSERT 设置为 OFF 时,无法手动为身份插入 ID 实体插入显式值
【发布时间】:2018-06-22 13:18:36
【问题描述】:

我有一张桌子Worker

 public class Worker
 {
        public int ID { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public string Fathername { get; set; }
        public string email { get; set; }
        public string Company_name { get; set; }    
}  

我尝试添加一个新工人:

new Worker { Firstname = "John", Lastname = "Rambo", Fathername = "First_Blood", email = "Rocky@hh.ru", Company_name = "Survive" },

我在上次调试的应用程序洞察中遇到错误

Microsoft.EntityFrameworkCore.DbUpdateException:更新条目时出错。有关详细信息,请参阅内部异常。

System.Data.SqlClient.SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Worker' 中插入标识列的显式值。

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action`1

当然,我可以删除 ID,它会自动添加。但是我想手动添加它,如果它被清空然后自动生成。

【问题讨论】:

    标签: c# entity


    【解决方案1】:

    首先,您的 ID 列永远不会为空,因为您使用的是 int 类型而不是可为空的 int 类型。

    您可以通过将 public int ID { get; set; } 更改为 public int? ID { get; set; } 来使您的 int 类型为空

    您收到此错误的原因是因为IDENTITY_INSERT 在您的数据库中设置为关闭。

    如果您将以下属性/约定应用于类中的属性并更新对数据库的更改,您应该会发现您可以插入到标识列中。

    public class Worker
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int ID { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public string Fathername { get; set; }
        public string email { get; set; }
        public string Company_name { get; set; }    
    } 
    

    或者,您可以使用 OnModelCreating 重载;

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Worker>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    }
    

    【讨论】:

    • 谢谢。我知道“?”符号并会尝试。
    • 但是如果不是我添加的,我需要自动生成ID。
    • 我将 Worker 和 WorkerAssignment 重设为 int?但我有 if (!WorkerExists(Worker.ID)) { return NotFound(); }
    • 最好把 if(!WorkerExists(Worker.ID)) 改成 if(!Worker.ID.HasValue || !WorkerExists(Worker.ID.Value))
    • 如果我只添加“?”,则会出现“无法插入显式值”错误符号
    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 2020-06-06
    • 2019-11-29
    • 2017-10-26
    • 2019-03-10
    • 2016-07-01
    • 2018-06-29
    • 2016-08-18
    相关资源
    最近更新 更多