【发布时间】:2019-05-29 17:13:03
【问题描述】:
我正在使用实体框架将数据添加到 sql 中的表中。 我有以下类和方法来添加新记录。 但我收到以下错误。
SqlException:违反主键约束 'PK__Users__3214EC27E90BFE7E'。无法在对象中插入重复键 'dbo.Users'。重复键值为 (0)。该声明已 终止。
public partial class User
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
public void InsertUser(MyEvent e)
{
using (var db = CreateInstance())
{
var users = db.Set<User>();
users.Add(new User
{
Name= e.Name,
Surname= e.Surname
});
db.SaveChanges();
}
}
EF如何自动增加表中的ID?
【问题讨论】:
-
只是一个问题,您确实将数据库中的该列配置为标识列,对吗?该属性只是说“这将来自数据库”,您还需要确保数据库实际生成一个新值。
-
适用于 MS SQL Server
-
转到数据库并确保字段 Id 是表中的标识。如果不是。您应该更新数据库以应用更改。
-
主键是在数据库的存储过程中创建,而不是在 C# 代码中。网上有很多关于使用存储过程生成唯一 ID 的文章。您可以拥有一个 SERVER 集群,并且每个服务器都应该有一个唯一的前缀,以避免不同的服务器创建重复的密钥。当您有一个具有多个用户的服务器时,您必须避免两个客户端使用相同的主 ID,因此您必须使用具有锁的存储过程,以便一次只有一个用户可以创建下一个可用 ID。
标签: c# sql-server entity-framework