Co je ORM?
- ORM (Object-Relational Mapping) je technologie, která umožňuje pracovat s databází pomocí běžných objektů v jazyce C#.
- Cílem je odstínit programátora od přímé práce se SQL a umožnit přístup k datům přes třídy, kolekce a vlastnosti.
Entity Framework (EF)
- Entity Framework je nejpoužívanější ORM framework v C#.
- EF 6 – starší verze, součást .NET Frameworku
- EF Core – moderní, multiplatformní verze (doporučeno)
- Oficiální dokumentace: https://docs.microsoft.com/en-us/ef/
Přístupy vývoje databáze
- Code First – definujeme modely v kódu → databáze se generuje podle něj.
- Database First – začínáme existující databází → generuje se kód z databáze.
- V této lekci používáme přístup Code First.
Instalace EF Core pomocí NuGet
Tip
NuGet je správce balíčků pro platformu .NET
- Nutné balíčky (pro SQLite např.):
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Tools
(pro příkazy jakodotnet ef
)
Model – datové třídy
- Třída reprezentující tabulku:
public class Custommer {
public int Id { get; set; } // primární klíč
public string Name { get; set; }
public int AddressId { get; set; }
public virtual Address Address { get; set; } // navigační vlastnost
}
- Konvence EF:
- Vlastnost
Id
neboNázevTřídyId
je automaticky primární klíč. - Navigační vlastnosti (
virtual
) propojují entity mezi sebou.
- Vlastnost
Kontext databáze – DbContext
- Objekt zajišťující komunikaci s databází:
public class EshopContext : DbContext {
public DbSet<Address> Addresses { get; set; }
public DbSet<Custommer> Custommers { get; set; }
}
- Pro každý model vytvoříme
DbSet<T>
– což reprezentuje tabulku.
Vytvoření databáze a migrace
- Nainstalovat nástroje:
dotnet tool install --global dotnet-ef
- Přidat migraci:
dotnet ef migrations add InitialCreate
- Vytvořit databázi:
dotnet ef database update
Práce s daty
Vložení dat
using (var ctx = new EshopContext()) {
var address = new Address { City = "Olomouc", Street = "17. listopadu", Number = 14 };
var customer = new Custommer { Name = "Karel Vomáčka", Address = address };
ctx.Custommers.Add(customer);
ctx.SaveChanges(); // nutné volat pro uložení změn
}
Výběr dat
using (var ctx = new EshopContext()) {
var customers = ctx.Custommers.Where(c => c.Address.City == "Olomouc");
foreach (var c in customers) {
Console.WriteLine($"{c.Name}, {c.Id}");
}
}
Migrace databáze
- Při změně objektu je nutné změnu “propsat” i do databáze ⇒ systém verzování a migrací
- Tabulka
_EFMigrationHistory
zaznamenává změny v databázi
dotnet ef migrations add <nazev_migrace>
dotnet ef database update
- Po těchto příkazech proběhla aktualizace databáze s propsání změn
Vztahy mezi entitami
Vazba 1:N
- např. adresa má více studentů
public class Address {
public int Id { get; set; }
public string City { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
Vazba M:N
- student má více předmětů
- Musíme vytvořit mezi-entitu:
public class StudentSubject {
public int StudentId { get; set; }
public Student Student { get; set; }
public int SubjectId { get; set; }
public Subject Subject { get; set; }
}
- A nakonfigurovat ve
DbContext
:
modelBuilder.Entity<StudentSubject>().HasKey(ss => new { ss.StudentId, ss.SubjectId });
Úprava dat
var student = ctx.Students.FirstOrDefault(s => s.Id == 1);
if (student != null) {
student.Name = "Dave Lister";
ctx.SaveChanges();
}
Smazání záznamu
var student = ctx.Students.FirstOrDefault(s => s.Id == 1);
ctx.Students.Remove(student);
ctx.SaveChanges();
Nastavením stavu:
ctx.Entry(student).State = EntityState.Deleted;
- Pozor na kaskádové mazání: nutné nastavit v modelu (viz dokumentace).
Shrnutí
- EF Core umožňuje práci s databází přímo přes C# objekty.
- Code First vývoj je rychlý a flexibilní.
DbContext
je základní brána pro práci s daty.- Podporuje LINQ pro dotazy, navigační vlastnosti a migrace schématu.
- EF šetří čas, ale je třeba chápat jeho principy – zejména vztahy, konvence a životní cyklus objektů.