【问题标题】:EF - Save Changes - How to fix VIOLATION OF PRIMARY KEY constraintEF - 保存更改 - 如何修复 VIOLATION OF PRIMARY KEY 约束
【发布时间】: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


【解决方案1】:

增加 PK 的应该是 SQL 服务器本身,而不是 EF。如果您有多个 EF 客户端同时将数据插入数据库,则很难确保 PK 正确递增。使用 SQL 更容易,您只需将 PK 列设置为具有自动增量的标识。

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

[row_id] [int] IDENTITY(1,1) NOT NULL

或者,如果您使用 SSMS 设计器创建表,则在列属性中将 Identity Specification 设置为:

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

【讨论】:

    【解决方案2】:

    删除DB 并定义为:

    public int Id { get; set; }
    

    没有任何数据注释

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多