Search code examples
sqlrowcode-firstentity-framework-migrations

code first database : SqlException: Violation of PRIMARY KEY constraint 'PK_dbo.PrivatKasses'.


I have a model like this:

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

}

and a function that checks if the table is empty. if yes functions adds new rows. The function:

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();
                }



            }


        }

But I get an SqlExeption :

System.Data.Entity.Infrastructure.DbUpdateException: "An error occurred while updating the entries. See the inner exception for details."

UpdateException: An error occurred while updating the entries. See the inner exception for details.

SqlException: Violation of PRIMARY KEY constraint 'PK_dbo.PrivatKasses'. Cannot insert duplicate key in object 'dbo.PrivatKasses'. The duplicate key value is (0).

The statement has been terminated.

How can i fix this problem?


Solution

  • I believe the issue is because you are not providing the id (and the default in a int is 0) since you declare

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    

    which means that the db will not create the id, I recommend to use Identity instead

    [DatabaseGenerated(DatabaseGeneratedOption.Identity )]
    

    then you should be able to use

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

    otherwise provide the id

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