Att underhålla en databas (del 2 – Entity Framework Migrations)

Att underhålla en databas (del 2 – Entity Framework Migrations)
augusti 22, 2012 adam.lith@squeed.com

Denna blogpost är en fortsättning på Att underhålla en databas (del 1).

Microsoft släppte i våras Entity Framework Migrations, vilket är ett Migrations-verktyg för oss som sitter i .Net. Idén bakom verktyget är inte nytt, då det t.ex kommer med ramverket ruby on rails där det kallas Active Records Migrations, och det har även funnits tredjeparts ramverk till C# så som DotNetMigrations. Så hur fungerar EF Migrations och på vilket sätt är det det bästa migrations-verktyget som jag än så länge har sett (oberoende av plattform)?

Ett migrations-verktyg bygger på principen av förändringsskript som jag beskrev i min föregående blogpost. Migrations bygger vidare på den idén genom att definiera en struktur för skripten, och automatiserar hanteringen av dem.

I EF Migrations så är strukturen så simpel som en mapp med .cs filer, där varje fil representerar en migration. En migration består av två förändringsskript; Ett ”Up”-skript för hur en förändring appliceras, samt ett ”Down”-skript för hur samma förändring reverseras. Varje migration får dessutom en timestamp prefixat på sitt filnamn, så att det finns en enkel och tydlig ordning mellan de olika skripten.

För att hålla reda på i vilket tillstånd din databas befinner sig i så skapar EF migrations en tabell i din databas som heter __MigrationHistory som innehåller information om vilka migrations som är applicerade på databasen, så att när du ber om att uppdatera databasen till en viss version, så vet den vilka migrations den behöver applicera alternativt reversera. Man kan be EF Migrations att antingen applicera förändringarna direkt, eller att få ut ett SQL skript som man kan ge till en DBA att köra vid produktionssättning och uppdatering.

Det är hela idén. Så simpelt är det. Men det är även det som gör det så vackert och smidigt att arbeta med.

Vill man skapa en ny migration så öppnar man Package Manager Console och skriver “Add-Migration” följt av namnet på sin migration (i exemplet nedan AddTableEmployees) och man möts då av en tom fil:

using System.Data.Entity.Migrations;

public partial class AddTableEmployees : DbMigration
{
    public override void Up()
    {

    }

    public override void Down()
    {

    }
}

Det som är verkligt smidigt med EF Migrations, och som får det att bli mycket mer attraktivt än de andra migrationsramverken som jag har använt, är hur man kan skriva sina migrations helt i C#:

using System.Data.Entity.Migrations;

public partial class AddTableEmployees : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "Employees",
            cb => new
            {
                EmployeeId = cb.Long(
                    nullable: false,
                    identity: true),
                FirstName = cb.String(
                    nullable: true,
                    unicode: true,
                    maxLength: 150)
            });
    }

    public override void Down()
    {
        DropTable("Employees");
    }
}

Men man kan samtidigt lika enkelt skriva vanlig SQL:

public partial class ExampleSqlMigration : DbMigration
{
    public override void Up()
    {
        Sql(@"UPDATE Employees 
              SET FirstName = ''
              WHERE FirstName IS NULL");
    }

    public override void Down()
    {
        // Reversal of migration not necessary.
    }
}

För att applicera migrations mot sin lokala databas så skriver man “Update-Database” i Package Manager Console. För att reversera så kan man använda “-TargetMigration:” flaggan och namnge den migration som man vill gå till.

Jag har medvetet utelämnat det som kallas för ”Code first migrations” från Entity Framework, för jag tycker pesonligen inte att det är det som gör migrations fantastiskt, även om det är mycket kraftfullt. Vem vet, det kanske blir en del 3 i framtiden som handlar om just detta.

Jag kommer prata mer om Entity Framework Migrations på nforum den 19:e september 2012, så kom gärna och lyssna!

0 Kommentarer

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *

*

Denna webbplats använder Akismet för att minska skräppost. Lär dig hur din kommentardata bearbetas.