【问题标题】:Cant insert identity column in EF, despite never changing the value尽管从未更改值,但无法在 EF 中插入标识列
【发布时间】:2019-06-12 22:38:52
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 您正在检索现有记录并再次添加它,就好像它是一条新记录一样。你想做什么?
  • 因此您尝试插入具有不同 ID 的多个副本。 EF 可能会拦截需求并阻止您在它进入数据库之前执行它......为什么不使用存储过程来处理这种情况?

标签: c# entity-framework


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    您可能想尝试一些影响:

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

    上面的代码打算将模型注册为它自己的新版本,它应该在你的数据库表中添加一条新记录,除了ID之外,它与第一个完全相同

    希望对你有帮助

    【讨论】:

    • 我在示例中添加了另一个字段,以表明我正在更改其他字段,但仍然出现此错误。很抱歉造成混乱
    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 2017-12-31
    • 2020-02-03
    • 2015-10-27
    • 2019-02-21
    • 2021-07-15
    • 2014-06-13
    相关资源
    最近更新 更多