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

时间:2019-01-18 16:19:57

标签: c# entity-framework

我正在尝试使用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 个答案:

答案 0 :(得分:2)

如果您使用相同的DbContext实例检索并修改了模型,则无需调用Add方法,只需调用.SaveChanges()

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

答案 1 :(得分:0)

您正在选择现有记录,然后尝试再次添加。

您收到的错误可能是因为您的数据库中有一个identity字段,而代码中有[DatabaseGenerated(DatabaseGeneratedOption.Identity)]则表明这是事实。

您可能想尝试一些能够影响以下方面的事情:

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

上面的代码旨在将模型注册为自身的新版本,这应该向数据库表中添加一条与ID完全相同的新记录

希望这会有所帮助