EF Core将Id设置为Int.MinValue并尝试在数据库中插入

时间:2017-08-04 11:09:31

标签: entity-framework-core

我正在使用EF Core,当我保存新实体时遇到问题。

这是我的模型类

[Column("Id")]
public int ID { get; set; }
[Required]
[Column("Pratica", TypeName = "varchar(10)")]
public string PRATICA { get; set; }
[Column("Anno")]
public int ANNO { get; set; }
[Required]
[Column("Variante", TypeName = "varchar(2)")]
public string VARIANTE { get; set; }

在这里,我创建并初始化一个新的PRAT对象:

var prat = new PRAT();
prat.PRATICA = "Prova";
prat.ANNO = 2000;
prat.VARIANTE = "0";
context.PRAT.Add(prat);
context.SaveChangesAsync();

在context.PRAT.Add(prat)行之后,如果我检查prat.ID成员,我会得到类似-2147482647的内容

在context.SaveChangesAsync之后我收到错误“当IDENTITY_INSERT设置为OFF时,无法在表'Prat'中为标识列插入显式值”

这是生成的SQL语句:

INSERT INTO [Prat] ([Id], [Anno], [Pratica], [Variante]) VALUES (@p0, @p1, @p2, @p3);

正如您所见,Id字段已添加到字段列表中,但此字段为Identity!

如果在context.SaveChangesAsync()之前设置了

prat.ID = 0

生成的SQL语句是

INSERT INTO [Prat] ([Anno], [Pratica], [Variante]) VALUES (@p0, @p1, @p2);

一切正常。

谢谢。

2 个答案:

答案 0 :(得分:0)

主键属性的类型为int,根据约定,EF Core假定数据库将使用SQL。 IDENTITY命令,用于在添加新行时创建唯一键。因此,您必须将数据库列定义为identity列。

答案 1 :(得分:0)

我认为您需要使用DatabaseGenerated属性配置模型,或使用fluent api

配置模型
...
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("Id")]
public int ID { get; set; }
...