Migrations databases in C#
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:
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:
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.