代码之家  ›  专栏  ›  技术社区  ›  Rilcon42

无法在ef中插入标识列,尽管从未更改该值

  •  0
  • Rilcon42  · 技术社区  · 6 年前

    我正在尝试使用EntityFramework更新表行, 不更改我的代码中的ID列 . 为什么它仍然告诉我不能插入显式值?

    当IDENTITY“INSERT”设置为“off”时,无法在表“TbllicenseGroups”中插入标识列的显式值。

    我的密码

    //mytbl context is initialized as _gc
    var mymodel=_gc.mytbl.Where(x=>x.ID.ToString()=="1").FirstorDefault();
    mymodel.otherfield=22;//sets a new value
    _gc.Add(mymodel);
    _gc.SaveChanges();
    

    EF模型

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }
    
        public int otherfield { get; set; }
    

    创建SQL

    CREATE TABLE [dbo].[tblLicenseGroups](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        ....
     CONSTRAINT [PK_tblSiteParentIDs] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   ste-fu    6 年前

    如果已使用dbContext的同一实例检索并修改了模型,则不需要调用 Add 方法,公正 .SaveChanges()

    更新部分自动发生,因为EF跟踪您对数据库中的对象所做的更改。

        2
  •  0
  •   Mark Davies    6 年前

    您正在选择一个现有记录,并尝试再次添加它。

    您收到的错误可能是因为 identity 数据库中的字段,具有 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 你的代码表明这是真的。

    你可能想尝试一些有以下影响的事情:

     var mymodel=_gc.mytbl.Where(x=>x.ID.ToString()=="1").FirstorDefault();
     mymodel.ID = 0;
     _gc.Add(mymodel);
    _gc.SaveChanges();
    

    上面的代码打算将模型注册为其自身的新版本,它应该向数据库表中添加一个新记录,该记录与第一个记录(除了ID)完全相同。

    希望这有帮助