代码第一个数据库:SqlException:违反主键约束“PK_dbo.PrivatKasses”。

Posted

技术标签:

【中文标题】代码第一个数据库:SqlException:违反主键约束“PK_dbo.PrivatKasses”。【英文标题】:code first database : SqlException: Violation of PRIMARY KEY constraint 'PK_dbo.PrivatKasses'. 【发布时间】:2017-06-16 16:31:39 【问题描述】:

我有一个这样的模型:

class PrivatKasse

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID  get; set; 
    public decimal Betrag  get; set; 
    public int BenutzerID  get; set; 


还有一个检查表是否为空的函数。如果是,函数会添加新行。功能:

public static void DatabaseChecker()
    
        using (var _db = new DataContext())
        
            if (!_db.KasseGemeinsam.Any())
            
                _db.KasseGemeinsam.Add(new Models.Data.KasseGemeinsamModel()  Jahr = DateTime.Now.Year.ToString(), Monat = MonatenVertauchen.ZahlZuMonaten(Convert.ToInt32(DateTime.Now.Month)), Haushalt = 0, Hygine = 0, Mobel = 0, Nahrung = 0, Schreibware = 0, Sonstiges = 0 );
                _db.SaveChanges();
            

            if (!_db.KassePrivat.Any())
            
                _db.KassePrivat.Add(new Models.Data.KassePrivatModel()  Jahr = DateTime.Now.Year.ToString(), Monat = MonatenVertauchen.ZahlZuMonaten(Convert.ToInt32(DateTime.Now.Month)), UserID = UserIdentity.UserID, Fahrkosten = 0, Hygine = 0, Mobel = 0, Nahrung = 0, Schreibware = 0, Sonstiges = 0 );
                _db.SaveChanges();
            

            if (!_db.GemeinsamKasse.Any())
            
                _db.GemeinsamKasse.Add(new Models.Data.GemeinsamKasse()  Betrag = 0 );
                _db.SaveChanges();
            

            if (!_db.PrivatKasse.Any())
            
                List<int> userIDs = new List<int>();
                foreach (var item in _db.UsersTbl)
                
                    userIDs.Add(item.ID);
                
                using (var _db2 = new DataContext())
                
                    foreach (var item in userIDs)
                    
                        _db2.PrivatKasse.Add(new Models.Data.PrivatKasse()  BenutzerID = item, Betrag = 0 );

                    
                    _db2.SaveChanges();
                



            


        

但我得到一个 SqlExeption :

System.Data.Entity.Infrastructure.DbUpdateException:“更新条目时发生错误。有关详细信息,请参阅内部异常。”

UpdateException:更新条目时发生错误。见 详细信息的内部异常。

SqlException:违反主键约束 'PK_dbo.PrivatKasses'。无法在对象中插入重复键 'dbo.PrivatKasses'。重复键值为 (0)。

语句已终止。

我该如何解决这个问题?

【问题讨论】:

这个BenutzerID = item, Betrag = 0不应该是BenutzerID = item.ID, Betrag = 0吗? 要么为 PrivatKasse 提供 ID,要么取消属性 [DatabaseGenerated(DatabaseGeneratedOption.None)],使其成为一个身份字段(int 键的默认值)。 @WEI_DBA 我认为不会。那是一个 ID 整数列表。 【参考方案1】:

我认为问题是因为您声明后没有提供 id(并且 int 中的默认值为 0)

[DatabaseGenerated(DatabaseGeneratedOption.None)]

这意味着db不会创建id,我建议使用Identity来代替

[DatabaseGenerated(DatabaseGeneratedOption.Identity )]

那么你应该可以使用

_db2.PrivatKasse.Add(new Models.Data.PrivatKasse()  BenutzerID = item, Betrag = 0 )

否则提供 id

_db2.PrivatKasse.Add(new Models.Data.PrivatKasse() ID= customID, BenutzerID = item, Betrag = 0 )

【讨论】:

我已更改为 [DatabaseGenerated(DatabaseGeneratedOption.Identity )] 但我仍然有这个期望。 您必须在数据库中执行更改,我的意思是您的 ID 已更改为身份

以上是关于代码第一个数据库:SqlException:违反主键约束“PK_dbo.PrivatKasses”。的主要内容,如果未能解决你的问题,请参考以下文章

System.Data.SqlClient.SqlException:'违反主键约束

java.sql.SQLException: ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011456)

foreach 总是重复第一个元素

SQLException:oracle 中的协议冲突

违反主键约束查询

MySQL数据库基础-2