【发布时间】:2022-01-05 14:42:30
【问题描述】:
我在一个 asp.net 核心项目中为 Destinations 表做一个粗略的处理。 (使用ef核心代码第一法)
当创建一个新的目的地时,我在调试控制台中遇到了这样的错误。
Exception data:
MessageText: duplicate key value violates unique constraint "PK_Destinations"
Detail: Key ("Id")=(33) already exists.
SchemaName: public
TableName: Destinations
ConstraintName: PK_Destinations
由于某些原因,我们已经创建了一个 Destinations 表并手动添加了数据。现在为那张桌子做点菜。我想这就是为什么会出现这个错误 Key ("Id")=(33) already exists.。
DbContext.cs
public DbSet<Destination> Destinations { get; set; }
service.cs
public async Task<Destination> Create(Destination destination)
{
await _catalogDbContext.Destinations.AddAsync(destination);
await _catalogDbContext.SaveChangesAsync();
return destination;
}
我的问题是
-
我的表中有 100 行。我们不能删除它们。 因此,添加新目的地时,目的地 id 应从 301 开始。
-
我们的开发数据库在我们的表中有 200 行。我们不能删除它们。 因此,添加新目的地时,目的地 id 应从 201 开始。
-
我们的生产数据库在我们的表中有 240 行。我们不能删除它们。 因此,添加新目的地时,目的地 id 应从 241 开始。
我怎么办,当创建一个目标ID应该从101、201或241开始。并且在添加一个新的ID后应该自动增加。?
编辑: 目的地.cs
public class Destination
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; private set; }
[Required]
public string Continent { get; set; }
[Required]
public string Country { get; set; }
[Required]
public string Iso { get; set; }
[Required]
public string Name { get; set; }
}
【问题讨论】:
-
请向我们展示
Destination类的外观,以及您传递给Create()方法的destination对象。 :) -
让数据库生成ID怎么样。将列设置为标识,告诉 EF ID 是数据花瓶生成的,当您将实体添加到上下文时不要提供 ID 值,当您保存它们时,EF 将检索 Id 并使用它更新实体,以便您可以使用它,如果您关心
-
@thesystem @Caius 请检查问题。我已经用
Destination.cs进行了编辑。 ID 是[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; private set; } -
你知道 33 是从哪里来的吗?为什么它尝试创建所有值的 ID 为 33 的行?我们可以先看看您是如何通过代码创建表格的吗?可能在 DbContext 中使用 modelbuilder 完成
-
另外,您可以将 Id 更改为 GUID,这样您每次都可以确保唯一的值。
标签: c# postgresql entity-framework-core ef-code-first asp.net-core-webapi