EF Migracije

Modul 2 - Lekcija 2.2

Enable-Migrations, Add-Migration, Update-Database

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

📖 Šta su Migracije?

Entity Framework Migracije omogućavaju vam da upravljate promjenama u strukturi baze (kreiranje tabela, kolona, ključeva) direktno kroz C# kod.

🔑 Prednosti:

  • Automatsko kreiranje CREATE/ALTER TABLE SQL skripti.
  • Version Control: C# klasa u Gitu jasno pokazuje ko je napravio promjenu.
  • Rollback (Undo): Vraćanje baze u nazad u slučaju greške.
  • Standardizacija: Isti kod kreira bazu svima u timu.
📖 Pogledaj Detaljno Objašnjenje →

🔄 Entity Framework Interno: __MigrationHistory

EF sam pamti šta je izvršeno, a šta nije. Kada se desi Update-Database, on kreira sistemsku tabelu.

Važno o __MigrationHistory:

  • Pamti MigrationId.
  • Posjeduje "Model" snaphot binarni potpis za poređenje sa C#.
  • Sprječava ponovno izvršavanje skripti.
📖 Pogledaj Detaljno Objašnjenje →
Migration History Lifecycle

🛠️ Tri Glavne Komande

Sve migracije se pokreću iz Package Manager Console prozora unutar Visual Studio-a.

1. Enable-Migrations

Izvršava se samo jednom po cijelom projektu. Kreira Migrations folder i Configuration.cs fajl.

2. Add-Migration ImeMigracije

Nakon što ste dodali polje (npr. JMBG) u model klasu, zovete ovu komandu. EF stvara C# fajl sa Up() i Down() instrukcijama. Ovo NE mijenja bazu još uvek!

3. Update-Database

Primjenjuje (Apply) neprimjenjenje migracije direktno na bazu. Prevođenje C# koda u ALTER TABLE i slanje na SQL Server.

📖 Pogledaj Detaljno Objašnjenje →

🔍 Struktura Migracijskog Fajla

Nakon Add-Migration InitialCreate, dobijete ovako nešto:


                    public partial class InitialCreate : DbMigration
                    {
                    public override void Up()
                    {
                    // Up() se pokreće kod Update-Database
                    CreateTable(
                    "dbo.Departments",
                    c => new {
                    DepartmentID = c.Int(nullable: false, identity: true),
                    Name = c.String(nullable: false, maxLength: 50)
                    })
                    .PrimaryKey(t => t.DepartmentID);
                    }

                    public override void Down()
                    {
                    // Down() se pokreće kod Rollback-a (undo opcija)
                    DropTable("dbo.Departments");
                    }
                    }
📖 Pogledaj Detaljno Objašnjenje →

↩️ Vraćanje Unazad (Rollback)

Šta ako ste greškom obrisali neku kolonu ili kreirali pogrešnu relaciju?


                    # TargetMigration parametar prima ime migracije na koju želite da se vratite
                    PM> Update-Database -TargetMigration InitialCreate

                    # Vrati sve na praznu bazu:
                    PM> Update-Database -TargetMigration $InitialDatabase

⚠️ Oprez

Ako radite Rollback migracije koja dodaje novu Tabelu, taj rollback (izvršavanjem DropTable u svojoj Down() metodi) briše sve podatke u toj tabeli! Nikad na produkciji!

📖 Pogledaj Detaljno Objašnjenje →

👥 Timski Rad i Rješavanje Konflikata

Ukoliko preuzmete kod (Git Pull) gdje je kolega napravio migraciju, a vi imate svoju netestiranu:

  1. Vratite bazu nazad (Rollback) na zadnju ispravnu zajedničku tačku koristeći -TargetMigration.
  2. Fizički obrišite konfliktni (vaš lokalni) .cs migracijski fajl.
  3. Izvršite Update-Database da preuzmete promjene koje je napravio vaš kolega.
  4. Pozovite ispočetka Add-Migration "MojaPromjena" -Force da stvorite novu migraciju koja prati najnovije stanje (onoliko promjena koliko vas razlikuje do aktuelne).

U praksi: Razgovarajte o promjenama baze prije nego ih gurnete u Git. Baza mora biti dogovorena!

📖 Pogledaj Detaljno Objašnjenje →

🌱 Seed Data (Inicijalni Podaci)

Koristite Configuration.cs (metoda Seed()) da ubacite šifarnike, admine itd.


                    protected override void Seed(JavnaUpravaDbContext context)
                    {
                    // AddOrUpdate automatski prepoznaje duplikate na bazi Name i vrsi samo Update!
                    context.Departments.AddOrUpdate(
                    d => d.DepartmentCode,
                    new Department { DepartmentName = "Ministarstvo Finansija", DepartmentCode = "MF" },
                    new Department { DepartmentName = "Ministarstvo Zdravlja", DepartmentCode = "MZ" }
                    );
                    }

Seed metoda se izvršava svaki put kad pokrenete Update-Database, zbog toga isključivo koristite metodu AddOrUpdate koja spriječava dupliranje unosa.

📖 Pogledaj Detaljno Objašnjenje →

✅ Zaključak

  • Enable-Migrations - Prvi i osnovni korak.
  • Add-Migration [Ime] - Očitavanje promjena Modela i pravljenje Up/Down plana.
  • Update-Database - Prevođenje u SQL i udar na fizičku Bazu podataka.
  • Seed() se koristi za "sigurno" učitavanje sistemskih početnih podataka / administratora.

📚 Sljedeća Lekcija

U Lekciji 2.3 radimo osnovne CRUD operacije nad podacima: Dodavanje (Add), Brisanje (Remove), Izmjena (Save) i učenje o specifičnostima Lazy vs Eager Loading-a !