Migrations databases in C#

Geschreven door: op woensdag 30 mei 2018

Leestijd:

Bij het ontwikkelen van applicaties in C# en Entity Framework kan je wijzigingen in de modellen automatisch doorvoeren in de corresponderende database-tabellen via Migrations. Dit heeft een aantal voordelen: bij Continuous Integration of Delivery zorg je ervoor dat je je applicaties automatisch op verschillende servers en omgevingen plaatst en de Migrations zorgen ervoor dat je gekoppelde databases worden aangepast; je hoeft minder diep in de database te duiken om toch de database-modellen aan te kunnen passen; als een migratie fout gaat, kan je altijd weer terug naar de vorige situatie. Naast het aanpassen van tabellen, kan je ook stored procedures updaten via migrations en andere, custom SQL uitvoeren.

Met migrations regel je tijdens het ontwikkelen zelf de structuur van je database-tabellen, het is geen Automatic Migration.

Voorbeeld

Ik heb een model BlogItem en hieraan wil ik de eigenschap public toevoegen, om aan te geven dat dit item alleen beschikbaar is voor beheerders of voor alle gebruikers.


public class BlogItem
    {
        [Key]
        public Guid Id {get; set;}
        public string Title{get;set;}
    }

Eerst zal ik in mijn model BlogItem.cs de property toevoegen. Daarna maak ik een Migration aan in Visual Studio. In de opstelling die ik heb gemaakt, worden deze migrations uitgevoerd de volgende keer dat de C#-applicatie wordt opgestart. Dit is de eenvoudigste manier van het gebruik van migrations, maar eerst zal je migrations moeten activeren.

Migraties activeren in Visual Studio

Om Migrations in je project te activeren moet je eerst een aantal stappen uitvoeren.

Ga naar Package Manager (Tools > Nuget Package Manager) en voer in: enable-migration.

Visual Studio zorgt er nu voor dat je applicatie gereed is voor migrations. Zelf zal je straks nog wat code moeten toevoegen om ervoor te zorgen dat bij het starten van je applicatie de database-aanpassingen automatisch worden doorgevoerd.

Maak daarna je eerst migrations door in dezelfde console aan te geven: Add-Migration InitialCreate (‘Initial Create’ is maar een naam – het mag van alles zijn).

In de map Migrations, die is aangemaakt, vind je nu een bestand, iets als 201805291745456_InitialCreate.cs. Hierin staan de acties die de applicaties zal uitvoeren om de database aan te passen. Bijvoorbeeld onder andere:


CreateTable(
                "dbo.BlogItems",
                c => new
                    {
                        Id = c.Guid(nullable: false),
                        Title = c.String(),
                    })
                .PrimaryKey(t => t.Id);

Ik heb zojuist BlogItem.cs aangemaakt en daarna Add-Migration uitgevoerd.

Om de wijzigingen door te voeren op de database (of om de database ueberhaupt aan te maken als deze nog niet bestaat, voer je in Package Manager Console in: Update-Database.

En zie:

database-migrations-1.png

Als ik nu isPublic toevoeg en een nieuwe Migration maak en uitvoer, dan staat deze nieuwe property in de database. Zie:

Nieuwe property:


public class BlogItem
    {
        [Key]
        public Guid Id {get; set;}
        public string Title{get;set;}
        public bool isPublic {get; set;}
    }

Migratie aanmaken:

PM> Add-Migration Add-Is-Public

Code om in database kolom aan te maken is gegenereerd:


    public override void Up()
        {
            AddColumn("dbo.BlogItems", "isPublic", c => c.Boolean(nullable: false));
        }

En als ik dit uitvoer: Update-Database, dan ziet de tabel er zo uit:

database-migrations-2.png

Migratie uitvoeren bij starten Application

Als ik een nieuwe eigenschap toevoeg, een migration maak en de applicatie daarna online deploy, dan kan ik op omgevingen waar de applicatie komt te staan, geen Update-Database uitvoeren in Visual Studio – of althans, het is vrij onhandig.

Om er toch voor te zorgen dat de migraties worden uitgevoerd, zorg je ervoor dat de Context een aparte Initializer krijgt en dit kan je doen in Application_Start() in Global.asax.cs:


protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            // ApplicationDbContext is hier de klasse van je database-context.
            Database.SetInitializer<ApplicationDbContext>(
                new MigrateDatabaseToLatestVersion<
                    ApplicationDbContext,
                    Migrations.Configuration
                >()
            );
        }

Wanneer je de applicatie nu start, zij het lokaal of op een server, dan zal de database worden ge-update zodra ApplicationDbContext wordt geïnitialiseerd, zonder handmatig Update-Database uit te voeren.

Voor een uitgebreidere uitleg van Microsoft zelf, zie: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application.

 


Andere blogartikelen

  • SQL: Geclusterde en niet-geclusterde index

    Geschreven door: op zondag 30 juni 2019

    Het kan soms voorkomen dat het veel tijd kost voordat een bepaalde query resultaten teruggeeft. Dit kan liggen aan een scala aan problemen, zoals het gebruik van veel joins. Wat de query kan helpen ve ...

    Bekijk het artikel »
  • Hoe werkt OAuth 2.0

    Geschreven door: op zondag 30 juni 2019

    In de huidige samenleving is iedereen bijna altijd online, zo ook de applicaties waarvan de mensen gebruik maken. Als je jouw applicatie niet goed afschermt, kan dit allemaal veiligheidsrisico’s met z ...

    Bekijk het artikel »
  • OAuth 2.0: JWT token en claims

    Geschreven door: op zondag 30 juni 2019

    In mijn vorige blog heb ik uitgelegd hoe OAuth 2.0 ervoor kan zorgen dat derde partijen op een veilige manier gebruik kunnen maken van jouw applicatie met behulp van tokens. In deze blog gaan we wat m ...

    Bekijk het artikel »
Bel 072 5345 888
Meer dan 40 bedrijven vertrouwen op ons
Onze Middelen en Technologieën
microsoft silver partner
Adobe partner
fd-gazellen-2018.jpg
Google analytics
partners-logo.jpg
Op de hoogte blijven?

Meld u aan voor de gratis nieuwsbrief om op de hoogte te blijven van onze activiteiten