【问题标题】:EF Core set Id to Int.MinValue and try to insert in databaseEF Core 将 Id 设置为 Int.MinValue 并尝试插入数据库
【发布时间】:2019-06-05 17:40:11
【问题描述】:

我正在使用 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();

如果我检查 prat.ID 成员,就在 context.PRAT.Add(prat) 行之后,我会得到类似 -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);

一切正常。

谢谢。

【问题讨论】:

  • 你在使用迁移吗?
  • 这对我来说很好用。 (正是上面的代码)。您使用的是哪个版本的 EF Core?
  • 对不起,我迟到了。我不使用迁移,我使用的是 EF Core 1.1.2 版。谢谢
  • @user7817808 EF Core 版本信息对于此类问题至关重要。即使这是早期 EF Core 中的一个问题,它也应该在很久以前就已修复。
  • Microsoft.EntityFrameworkCore 2.2.1,至少在我的情况下

标签: entity-framework-core


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 根据异常消息,数据库列已经是标识 - “当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Prat' 中插入 标识列 的显式值"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2013-10-08
    • 2011-08-05
    相关资源
    最近更新 更多