Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF-保存更改-如何修复违反主键约束的问题_C#_Sql Server_Entity Framework - Fatal编程技术网

C# EF-保存更改-如何修复违反主键约束的问题

C# EF-保存更改-如何修复违反主键约束的问题,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我正在使用实体框架将数据添加到sql中的表中。 我有下面的类和方法来添加新记录。 但是我得到了下面的错误 SqlException:违反主键约束 “PK_uuu用户_uuu3214EC27E90BFE7E”。无法在对象中插入重复的键 “dbo.Users”。重复的键值为(0)。声明已被修改 终止 公共部分类用户 { [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)] 公共int ID{get;set;} 公共字符串名称{get;se

我正在使用实体框架将数据添加到sql中的表中。 我有下面的类和方法来添加新记录。 但是我得到了下面的错误

SqlException:违反主键约束 “PK_uuu用户_uuu3214EC27E90BFE7E”。无法在对象中插入重复的键 “dbo.Users”。重复的键值为(0)。声明已被修改 终止

公共部分类用户
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
}        
公共空白插入器(MyEvent e)
{
使用(var db=CreateInstance())
{
var users=db.Set();
添加(新用户)
{
Name=e.Name,
姓氏
});
db.SaveChanges();
}
}

EF如何自动增加表中的ID?

删除
DB
,定义如下:

public int Id { get; set; }

如果没有任何数据注释,应该是SQL server本身增加PK,而不是EF。如果您有多个EF客户端同时向DB插入数据,则很难确保PK正确递增。使用SQL更容易,只需将PK列设置为自动递增的标识即可

如果PK列是row_id,可以通过脚本如下定义:

[row_id] [int] IDENTITY(1,1) NOT NULL
或者,如果使用SSMS designer创建表,则在列属性中将Identity Specification设置为:

Is Identity = Yes
Identity Increment = 1
Identity Seed = 1

只是一个问题,您在数据库中将该列配置为标识列,对吗?属性只是说“这将来自数据库”,您还需要确保数据库实际生成了一个新值。这是针对MS SQL Server的。请参见:转到数据库并确保字段Id为表中的标识。如果不是,则应更新数据库以应用更改。因此,应在数据库的存储过程中而不是在c代码中创建主键。web上有很多关于使用存储过程生成唯一ID的文章。您可以有一个服务器集群,每个服务器都应该有一个唯一的前缀,以避免不同的服务器创建重复的密钥。当一台服务器有多个用户时,必须避免两个客户端使用相同的主ID,因此必须使用具有锁的存储过程,以便一次只有一个用户可以创建下一个可用ID。
Is Identity = Yes
Identity Increment = 1
Identity Seed = 1