CRUD Operacije i LINQ to Entities

Modul 2 - Lekcija 2.3

Izvršavanje Create, Read, Update, Delete operacija i rad sa povezanim podacima

📚 Nivo: Srednji | 🎯 Praktični primjeri: 5

📖 LINQ to Entities (Read)

Language Integrated Query (LINQ) služi za pretragu baze koristeći C# (umjesto SQL).

Najčešće metode:

  • ToList() - Izvršava upit odmah i vraća listu iz baze.
  • Find(id) - Traži po Primary Key-u. Vrlo brzo.
  • Where(x => ...) - Filtrira podatke (kao i SQL WHERE).
  • OrderBy(x => ...) - Sortira zbirku rezultata.

                    // Filtrira zaposlenike iz specifičnog odjela i to one čije prezime kreće slovom A
                    var employees = db.Employees
                    .Where(e => e.DepartmentID == deptId && e.LastName.StartsWith("A"))
                    .OrderBy(e => e.LastName)
                    .ToList();
📖 Pogledaj Detaljno Objašnjenje →

➕ CREATE - Dodavanje Entiteta

Dodavanje novog reda u bazu radi se dodavanjem objekta u DbSet i čuvanjem promjena.


                    public ActionResult Create(Employee employee)
                    {
                    if (ModelState.IsValid)
                    {
                    // 1. Dodavanje u lokalni DbSet (još nije u bazi)
                    db.Employees.Add(employee);

                    // 2. Trajno spašavanje u SQL Bazu!
                    db.SaveChanges();

                    return RedirectToAction("Index");
                    }
                    return View(employee);
                    }

💡 SaveChanges() radi kao jedinstvena "Transakcija" (Sve ili Ništa princip).

📖 Pogledaj Detaljno Objašnjenje →

✏️ UPDATE - Ažuriranje Entiteta

Kada objekat stigne iz Web View-a, EF ne zna automatski šta se izmjenilo. Moramo mu ručno definisati stanje.


                    [HttpPost]
                    public ActionResult Edit(Employee employee)
                    {
                    if (ModelState.IsValid)
                    {
                    // Kažemo EF-u da je ovaj objekt Modified (izmijenjen)
                    db.Entry(employee).State = System.Data.Entity.EntityState.Modified;

                    // Zatim sačuvamo stanje za taj entitet
                    db.SaveChanges();
                    return RedirectToAction("Index");
                    }
                    return View(employee);
                    }
📖 Pogledaj Detaljno Objašnjenje →

⏱️ Concurrency (Višekorisnički Rad)

Šta ako dva službenika u Vladinoj agenciji istovremeno uđu u "Edit" istog predmeta, a zatim obojica snime? (Posljednji spašava / gazi!)

Rješenje: [Timestamp] i Optimistično Zaključavanje

  • Dodamo properties u Model: [Timestamp] public byte[] RowVersion {get;set;}
  • Prilikom Update-a, EF provjerava da li je RowVersion u bazi jednak onom starom.
  • Ako nije jednak, sistem izbacuje sistemsku DbUpdateConcurrencyException grešku!
  • Mi tu grešku uhvatimo u try/catch i prikažemo korisniku da mora osvježiti formu!
📖 Pogledaj Detaljno Objašnjenje →

🗑️ DELETE - Brisanje Entiteta

Slično kreiranju, za brisanje koristimo metodu Remove.


                    [HttpPost, ActionName("Delete")]
                    public ActionResult DeleteConfirmed(int id)
                    {
                    // Pronađi entitet po PK
                    var employee = db.Employees.Find(id);

                    if (employee != null)
                    {
                    // Označi za brisanje
                    db.Employees.Remove(employee);

                    // Pusti SQL Delete Skriptu na bazu
                    db.SaveChanges();
                    }
                    return RedirectToAction("Index");
                    }

⚠️ Oprez: Cascade Delete

Za javne i sigurne sisteme uglavnom uklanjamo Cascade delete jer brisanjem Ministarstva sistem bi nepovratno obrisao stotine radnika!

📖 Pogledaj Detaljno Objašnjenje →

🔄 Strategije Učitavanja Podataka (Veoma Važno!)

1. Eager Loading 2. Lazy Loading (Default) 3. Explicit Loading
Učitaj odmah (jedan SQL poziv)

Koristite .Include(e => e.Department) da odmah dobijete sve podatke odjednom.

✅ Brzo za liste podataka.
✅ Sprečava N+1.
Učitaj tajno i tek kad zatreba

Podržano zahvaljujući virtual ključnoj riječi.

N+1 Problem: Ako ispisujete u HTML Foreach petlji podatke, izvršit će SQL SELECT po svakom radniku! Jako usporava aplikaciju!
Ručno učitaj dodatne relacije

Ponekad trebate samo jedan objekt, i tek po uvjetu povlačite relaciju koristeći .Load() funkciju.

Rijetko se direktno koristi.
📖 Pogledaj Detaljno Objašnjenje →

🔍 Napredni LINQ Upiti

Matematika i Agregacije iznad C# Kolekcija:

  • 📝 Count(): db.Employees.Count(e => e.DeptId == 1)
  • 💰 Sum(): db.Departments.Sum(d => d.Budget)
  • 📊 GroupBy():

                    var employeesByDept = db.Employees
                    .GroupBy(e => e.DepartmentID)
                    .Select(g => new {
                    OdjelID = g.Key,
                    BrojRadnika = g.Count()
                    })
                    .ToList();
📖 Pogledaj Detaljno Objašnjenje →

✅ Zaključak

Šta smo savladali i usvojili:

  • Create/Update/Delete akcije funkcionišu izdvajanjem objekta i pozivom SaveChanges koji vrši jedinstvenu i sigurnu transakciju.
  • [Timestamp] je od presudne važnosti za rješavanje sudara promjena.
  • Eager Loading (Include) i kako riješiti "N+1 Problem" pad performansi zbog Lazy Loadinga kod listi.
  • ✅ Agregativni LINQ pozivi služe za formiranje kvalitetnih Dashboard-ova u aplikaciji.

📚 Završen Modul 2

Uspješno završen modul vezan za rad sa Bazom Podataka (Entiy Framework).