Modul 2 - Lekcija 2.3
Izvršavanje Create, Read, Update, Delete operacija i rad sa povezanim podacima
📚 Nivo: Srednji | 🎯 Praktični primjeri: 5
Language Integrated Query (LINQ) služi za pretragu baze koristeći C# (umjesto SQL).
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();
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).
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);
}
Šta ako dva službenika u Vladinoj agenciji istovremeno uđu u "Edit" istog predmeta, a zatim obojica snime? (Posljednji spašava / gazi!)
[Timestamp] public byte[] RowVersion {get;set;}RowVersion u bazi jednak onom starom.
DbUpdateConcurrencyException grešku!
try/catch i prikažemo korisniku da mora osvježiti
formu!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");
}
Za javne i sigurne sisteme uglavnom uklanjamo Cascade delete jer brisanjem Ministarstva sistem bi nepovratno obrisao stotine radnika!
| 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. |
Matematika i Agregacije iznad C# Kolekcija:
db.Employees.Count(e => e.DeptId == 1)db.Departments.Sum(d => d.Budget)
var employeesByDept = db.Employees
.GroupBy(e => e.DepartmentID)
.Select(g => new {
OdjelID = g.Key,
BrojRadnika = g.Count()
})
.ToList();
Šta smo savladali i usvojili:
SaveChanges koji vrši jedinstvenu i sigurnu transakciju.Uspješno završen modul vezan za rad sa Bazom Podataka (Entiy Framework).