ef core - tutoriale

0

Tutoriale do ef core to fajna sprawa. Dają człowiekowi takie przyjemne wrażenie, że jest piękny i mądry i że wystarczy pół godzinki przerabiania przykładu i pyk, komunikacja z bazą danych z poziomu aplikacji już nigdy nie będzie sprawiać problemu. Bo wiecie, w bibliotece są książki, uczniowie mają stopnie w dzienniku i takie tam, bułka z masłem. Potem się okazuje że czasem jest jednak trudniej, bo uczniowie mogą być zapisani na różne kursy, a różne kursy mogą mieć różnych studentów. No ale to też jest w tutorialu.
A potem chcesz przerobić coś wedle własnego pomysłu, np relacje koleżeńskie w grupie osób. Proste prawda?

public class Przyjaciel
{
public int Id {get; set;}
public string Imie {get; set;}
List<Przyjaciel> Przyjaciele {get; set;}
}

No jasne, że proste....... WRONG, BITCH
Nie dorosłeś do życia ale baza danych cię wszystkiego nauczy...
Po pierwsze, nie można tak sobie posiadać ludzi. Bo niby jak, na własność? Możemy co najwyżej posiadać relacje z ludźmi.

public class Przyjaciel
{
public int Id {get; set;}
public string Imie {get; set;}
List<Relacja> Przyjaciele {get; set;}
}
public class Relacja
{
public Przyjaciel Przyjaciel1 {get; set;}
public int Przyjaciel1Id {get; set;}
public Przyjaciel Przyjaciel2 {get; set;}
public int Przyjaciel2Id {get; set;}
}

Myślisz, ze tak jest dobrze? Bo jesteś głupi i ewidentnie nie przemyślałeś sobie zagadnienia. Co ty wiesz o przyjaźni? Czy to jest jakieś uczucie automatycznie łączące dwoje ludzi na wieki wieków amen? Baza danych nauczy cię życia kolego. Przecież to, że ty uważasz kogoś za przyjaciela wcale nie oznacza, że on się twoim przyjacielem czuje. I odwrotnie.

    public class Osoba
    {
        public int Id { get; set; }
        public string Imie { get; set; }
        public List<Relacja> DawcyPrzyjazni { get; set; }
        public List<Relacja> BiorcyPrzyjazni {get; set;}
        
    }
    public class Relacja
    {
        public Osoba Deklaruje { get; set; } 
        public int DeklarujeId { get; set; }
        public Osoba Otrzymuje { get; set; }
        public int OtrzymujeId { get; set; }

    }

Ok, masz to. Baza danych już cię życia uczyć nie będzie. Ale ef core się dopiero rozkręca. Bo gdzie sieroto podziałeś klucz do relacji?

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Relacja>().HasKey(k=> new {k.DeklarujeId, k.OtrzymujeId});

        }

No czarodzieju, masz to. I co? I jajco. Ale nie bój nic, ef core nie zostawi Cię na lodzie. Napisze ci że masz źle żebyś wiedział, że nie jest dobrze. Posiedź sobie teraz chwilkę dłużej na internecie, może coś znajdziesz.

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Relacja>().HasKey(k=> new {k.DeklarujeId, k.OtrzymujeId});

            modelBuilder.Entity<Relacja>().HasOne(relacja=> relacja.Deklaruje).WithMany(osoba => osoba.BiorcyPrzyjazni);

            modelBuilder.Entity<Relacja>().HasOne(relacja => relacja.Otrzymuje).WithMany(osoba => osoba.DawcyPrzyjazni);


        }

No proszę!. Kompiluje, wykonuje, dane do bazy ładuje, ślicznie!
No to teraz odczytajmy co tam się zapisało...

Osoba ania = context.osoby.Where(o=>o.Imie == "Ania").FirstOrDefault();

Ale jak to? Ania taka lubiana i towarzyska, i co... Gdzie adoratorzy, gdzie psiapsiułki, listy puste JezusMaryja!

var osoby = context.Osoby.Include(ob=>ob.BiorcyPrzyjazni).ThenInclude(bp=>bp.Otrzymuje).Include(od=>od.DawcyPrzyjazni).ThenInclude(dp=>dp.Deklaruje);
var ania = osoby.Where(o=>o.Imie == "Ania").FirstOrDefault();

No, jest. Spoko ten ef core, co nie? Wszystko da się zrobić!

A tak poważnie, to może ktoś mi powie jak to zrobić jednak trochę łatwiej?

1

No np. używając prawdziwego ORMa byłoby nieco łatwiej. Ale nadal musiałbyś się stosować do instrukcji obsługi i skonfigurować mapowania, więc to raczej nie rozwiąże Twojego problemu polegającego na awersji do dokumentacji.

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