duplikacja danych w bazie

0

Dlaczego po uruchomieniu kompilatora dane w bazie danych duplikują się, skoro w inicjalizatorze mam metodą AddOrUpdate()???? Oto kod:

 public static void SeedKursyData(KursyContext context)
        {
            var kategorie = new List<Kategoria> 
            {
                new Kategoria() {NazwaKategorii = "asp.net mvc", NazwaPlikuIkony = "aspnet.jpg", OpisKategorii = "Opis asp.net mvc"},
                new Kategoria() {NazwaKategorii = "java", NazwaPlikuIkony = "java.jpg", OpisKategorii = "Opis java"},
                new Kategoria() {NazwaKategorii = "php", NazwaPlikuIkony = "php.jpg", OpisKategorii = "Opis php"}
            };

            kategorie.ForEach(k => context.Kategorie.AddOrUpdate(k));
            context.SaveChanges();


            var kursy = new List<Kurs>
            {
                new Kurs() {AutorKursu = "Tomek", TytulKursu = "asp.net mvc", KategoriaId = 1, CenaKursu = 99, Bestseller = true, NazwaPlikuObrazka = "aspnet.jpg", DataDodania = DateTime.Now, OpisKursu = "Opis kursu1"},
                new Kurs() {AutorKursu = "Jurek", TytulKursu = "java", KategoriaId = 1, CenaKursu = 120, Bestseller = true, NazwaPlikuObrazka = "java.jpg", DataDodania = DateTime.Now, OpisKursu = "Opis kursu2"},
                new Kurs() {AutorKursu = "Wojtek", TytulKursu = "python", KategoriaId = 1, CenaKursu = 120, Bestseller = true, NazwaPlikuObrazka = "python.jpg", DataDodania = DateTime.Now, OpisKursu = "Opis kursu3"}
            };

            kursy.ForEach(k => context.Kursy.AddOrUpdate(k));
            context.SaveChanges();


        }
0

Nie znam AddOrUpdate ale zgaduje ze to przez to ze nie ustawiasz klucza glownego - jak context ma zgadnac ze chodzi Ci o istniejace/nowe rzeczy? Bez klucza nie zadziala. Wklej klase Kurs/Kategoria to moze latwiej bedzie cos powiedziec

0

klucz główny mam ustawiony. Proszę oto klasa Kurs i Kategoria:

public class Kurs
{
public int KursId { get; set; } //klucz główny
public int KategoriaId { get; set; } //klucz obcy
[Required(ErrorMessage = "Wprowadź nazwę kursu!")]
[StringLength(50)]
public string TytulKursu { get; set; }
[Required(ErrorMessage = "Wprowadź nazwę autora!")]
[StringLength(50)]
public string AutorKursu { get; set; }
public DateTime DataDodania { get; set; }
[StringLength(50)]
public string NazwaPlikuObrazka { get; set; }
public string OpisKursu { get; set; }
public decimal CenaKursu { get; set; }
public bool Bestseller { get; set; }
public bool Ukryty { get; set; }

    public virtual Kategoria kategoria { get; set; }
}

public class Kategoria
{
public int KategoriaId { get; set; } //klucz główny
[Required(ErrorMessage = "Wprowadź nazwę kategorii!")]
[StringLength(50)]
public string NazwaKategorii { get; set; }
[Required(ErrorMessage = "Wprowadź opis kategorii!")]
public string OpisKategorii { get; set; }
public string NazwaPlikuIkony { get; set; }

    public virtual ICollection<Kurs> Kursy { get; set; } 
}
0

No ale w seed nie ustawiasz nigdzie kluczy - tak wiec KursId oraz KluczId maja wartosc 0 - wartosci w bazie zapewne sa od 1 w zwyz dlatego context rozpoznaje podane przez Ciebie obiekty jako nowe a nie do update'u. Ustaw im takie id jak w bazie (zapewnie 1,2,3) a jest szansa ze bedzie dzialac.

0

Teraz wszystko działa. Musiałem to przeoczyć. Dziękuję bardzo za pomoc :)

1

Działa tylko czy ma sens?

IMHO AddOrUpdate powinien mieć jako pierwszy parametr TKey i raczej nie powinien to być klucz z tabeli bo jak baza to generuje to nie wiadomo co wygeneruje.

ja bym zrobił tak
... context.Kursy.AddOrUpdate(x=>x.TytulKursu, k);

Wtedy sprawdzanie do dodawania lub aktualizacji będzie wg TytulKursu a nie Id. Id (klucza głównego tabeli) generowanego przez bazę nie przypilnujesz na dłuższą metę.

0

Czyli zeby nie duplikowało tej tabeli Kursy, to w seedzie zawsze ustawiac wartosci KursId?

0

Nie, bo zwykle Id jest generowane przez bazę. Musisz użyć jakiegoś innego pola, które jest unikalne np Nazwa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1