EF zapis relacji do bazy danych

0

Witam,
nie mogę sobie poradzić z następującym problemem.
Mam kilka klas m.in. Country, Sport, Team, Game itd.
Klasa League składa się m.in z takich navigation properites

        public virtual Country Country { get; set; }
        public virtual Sport Sport { get; set; }
        public virtual ICollection<Team> Teams { get; set; }
        public virtual ICollection<Game> Games { get; set; }
 

Chcę dodać do bazy obiekt League, w tym celu tworzę najpierw obiekty country, sport itp. i dodaję je przy pomocy

context.Add()

do bazy, a Następnie tworzę obiekt League w ten sposób:

List<League> leagues = new List<League>()
            {
                new League()
                {
                    Name = "Ekstraklasa",
                    Country = context.Countries.Where(a => a.Name == "poland").FirstOrDefault(),
                    StartDate = DateTime.Now.AddDays(10),
                    EndDate = DateTime.Now.AddDays(60),
                    Sport = context.Sports.Where(i => i.Name == "football").FirstOrDefault(),
                },
                new League()
                {
                   Name = "Bundesliga",
                   Country = context.Countries.Where(a => a.Name == "germany").FirstOrDefault(),
                   StartDate = DateTime.Now,
                   EndDate = DateTime.Now.AddDays(30),
                   Sport = context.Sports.Where(i => i.Name == "football").FirstOrDefault(),
                }
            };
 

i następnie dodaję je do context.Leagues.Add().
Jednak za każdym razem rzuca mi wyjątkiem

Conflicting changes detected. This may happen when trying to insert multiple entities with the same key

i niestety nie mogę znaleźć rozwiązania tego błędu.
Będę wdzięczny za propozycje rozwiązania problemu, jeśli potrzeba więcej danych, dodam.

0

Widocznie coś jest ze stanem kontekstu.
Nie pokazałeś jak nim zarządzasz.
Tak na szybko, powinno zadziałać - ponowne utworzenie kontekstu , dodanie obiektów i zapis. Uważaj na przypisywanie kluczy obcych. Bezpieczniej jest po ID np **CountryId **(jeśli te obiekty istnieją w bazie - unikniesz niespodzianek w postaci duplikatów danych).

0

A spróbuj wyciągnąć context.Sports.Where(i => i.Name == "football").FirstOrDefault() i przypisz do jakiejś zmiennej, a następnie użyj jej przy tworzeniu obiektów League.

0
maciejmt napisał(a):

Widocznie coś jest ze stanem kontekstu.
Nie pokazałeś jak nim zarządzasz.
Tak na szybko, powinno zadziałać - ponowne utworzenie kontekstu , dodanie obiektów i zapis. Uważaj na przypisywanie kluczy obcych. Bezpieczniej jest po ID np **CountryId **(jeśli te obiekty istnieją w bazie - unikniesz niespodzianek w postaci duplikatów danych).

Spróbowałem to zrobić po Id tak jak proponujesz i ładnie wciągnął w odpowiednie listy i obiekty jak powinien jednak nadal rzuca tym wyjątkiem.
Tak wygląda część contextu myślę, że ta najważniejsza

modelBuilder.Entity<Team>().HasMany<League>(e => e.Leagues).WithMany(c => c.Teams);
            modelBuilder.Entity<Team>().HasMany<Game>(e => e.Games).WithRequired(s => s.Host).HasForeignKey(s => s.HostId).WillCascadeOnDelete(false);
            modelBuilder.Entity<Team>().HasMany<Game>(e => e.Games).WithRequired(s => s.Guest).HasForeignKey(s => s.GuestId).WillCascadeOnDelete(false);
            modelBuilder.Entity<Country>().HasMany<Team>(e => e.Teams).
                WithRequired(s => s.Country).HasForeignKey(s => s.CountryId).WillCascadeOnDelete(false);

            modelBuilder.Entity<Sport>().HasMany<Team>(e => e.Teams).
                WithRequired(s => s.Sport).HasForeignKey(s => s.SportId).WillCascadeOnDelete(false);

            modelBuilder.Entity<Sport>().HasMany<League>(e => e.Leagues).
                WithRequired(s => s.Sport).HasForeignKey(s => s.SportId).WillCascadeOnDelete(false);
            
            modelBuilder.Entity<League>().HasMany<Game>(e => e.Games).WithRequired(s => s.League).HasForeignKey(s => s.LeagueId);

            modelBuilder.Entity<Country>().HasMany<League>(e => e.Leagues).WithRequired(s => s.Country).HasForeignKey(s => s.CountryId);
 

Edit: Stworzenie nowej klasy contextu z tymi samymi danymi, podmienienie connectionstringa nie pomogło.

0

A masz na pewno włączony identity na primary key w League? Bo miałem o tym zapomniałem i podobny komunikat mi się pojawiał.

0
siararadek napisał(a):

A masz na pewno włączony identity na primary key w League? Bo miałem o tym zapomniałem i podobny komunikat mi się pojawiał.

CREATE TABLE [dbo].[Leagues] (
    [Id]        INT            IDENTITY (1, 1) NOT NULL,

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