{"id":1709,"date":"2018-03-27T22:00:00","date_gmt":"2018-03-27T20:00:00","guid":{"rendered":"https:\/\/demo.sidekick.be\/itenium\/package-manager-console-ef-migrations\/"},"modified":"2025-11-28T13:31:47","modified_gmt":"2025-11-28T12:31:47","slug":"package-manager-console-ef-migrations","status":"publish","type":"post","link":"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/","title":{"rendered":"Package Manager Console Entity Framework 6 Migrations profile"},"content":{"rendered":"<h1 id=\"activating-your-nuget_profile\">Activating your Nuget_profile<\/h1>\n<p>When opening the Package Manager Console (PMC) in Visual Studio, the profile file is executed.<\/p>\n<pre><code class=\"language-cmd\">%USERPROFILE%DocumentsWindowsPowerShellNuGet_profile.ps1\n<\/code><\/pre>\n<p>You can reload the NuGet_profile.ps1 file using <code>. $profile<\/code> in the PMC.<\/p>\n<p>The following aliases allow you to install a package with just <code>ip EntityFramework<\/code>:<\/p>\n<pre><code class=\"language-powershell\">Set-Alias ip Install-Package\nSet-Alias unip Uninstall-Package\n<\/code><\/pre>\n<h1 id=\"provide-most-likely--project-parameter\">Provide most likely -Project parameter<\/h1>\n<p>There is (unfortunately) no way to configure the \u201cDefault project\u201d in the PMC. This workaround creates a Verb-RealNoun for each existing cmdlet and adds a short alias to these commands. Which project contains the migrations is by convention, as determined by <code>$isLikelyDbContextProject<\/code>.<\/p>\n<pre><code class=\"language-powershell\"># Execute commands against first ProjectName to end with one of these:\n$isLikelyDbContextProject = \".DataAccess\", \".Back\"\n\nfunction Get-DbContextProject {\n\treturn Get-Project -All |\n\t\tWhere-Object {\n\t\t\tif ($_.ProjectName.LastIndexOf(\".\") -gt -1) {\n\t\t\t\treturn $isLikelyDbContextProject -match $_.ProjectName.Substring($_.ProjectName.LastIndexOf(\".\"))\n\t\t\t} else {\n\t\t\t\treturn $false\n\t\t\t}\n\t\t} | Select -First 1\n}\n\nfunction Add-RealMigration($name = \"test\") {\n\t$project = Get-DbContextProject\n\tAdd-Migration $name -Project $project.ProjectName\n}\n\nSet-Alias am Add-RealMigration\n\n# Usage\nam AddedBlogTable\n<\/code><\/pre>\n<p>The entire list of aliases:<\/p>\n<pre><code class=\"language-powershell\">Set-Alias em Enable-RealMigrations\nSet-Alias am Add-RealMigration\nSet-Alias ad Add-RealMigration\nSet-Alias ud Update-RealDatabase\nSet-Alias udv Update-RealDatabaseVerbosely\nSet-Alias gam Get-AppliedMigrations\nSet-Alias lm List-Migrations # List last $listMigrationsCount\nSet-Alias lam List-AllMigrations\n<\/code><\/pre>\n<hr \/>\n<h1 id=\"updating-the-database-using-a-numeric-targetmigration\">Updating the database using a numeric TargetMigration<\/h1>\n<p>Easily go back to a specific migration using <code>ud -1<\/code> instead of<\/p>\n<pre><code class=\"language-powershell\">Update-Database -TargetMigration:SecondLastMigrationName\n<\/code><\/pre>\n<h2 id=\"usage\">Usage<\/h2>\n<pre><code class=\"language-powershell\"># List last 5 migrations:\n# (aliased as List-Migrations or lm)\n$ Get-MigrationsTable | Select-Object -First 5 | Format-Table -AutoSize\n\nIndex Name                   Created          FullName  \n----- ----                   -------          --------  \n0     MatchShouldBePlayed    12\/24\/2016 16:25 201612241625590_MatchShouldBePlayed.cs  \n-1    MatchFormationComment  12\/24\/2016 14:34 201612241434105_MatchFormationComment.cs  \n-2    UserPasswordResetLinks 10\/23\/2016 18:53 201610231853333_UserPasswordResetLinks.cs  \n-3    ClubManagerTypes       09\/23\/2016 20:46 201609232046188_ClubManagerTypes.cs  \n-4    BlockMatchField        08\/18\/2016 21:40 201608182140266_BlockMatchField.cs  \n\n# Update database to ClubManagerTypes\n$ Update-RealDatabase -3 # Alias: ud -3\n\n# Update database to latest migration (MatchShouldBePlayed)\n$ Update-RealDatabase 0 # Alias: ud\n<\/code><\/pre>\n<p><strong>Attention<\/strong>:<br \/> This completely ignores whatever may be the last migration that was applied to the database. Having <code>Update-RealDatabase -1<\/code> go back to the \u201clast <em>applied<\/em> migration &#8211; 1\u201d instead of the current implementation \u201cgo to the second last migration added to the project\u201d, would require analysing <code>Get-Migrations<\/code>, which would make the whole thing considerably slower. (FileSystem vs Sql query)<\/p>\n<h2 id=\"source\">Source<\/h2>\n<pre><code class=\"language-powershell\">function Get-MigrationsTable {\n\t$project = Get-DbContextProject\n\t$projectPath = Split-Path -Path $project.FullName\n\n\t$migrations = Get-ChildItem \"$projectPathMigrations\" |\n\t\tWhere-Object { Test-MigrationName $_.Name } |\n\t\tSort-Object Name -Descending\n\n\treturn $migrations | ForEach-Object -Begin {$idx = 0} -Process {\n\t\t$withoutExt = $_.Name.Substring(0, $_.Name.LastIndexOf(\".\"))\n\t\t$migrationName = $withoutExt.Substring($withoutExt.IndexOf(\"_\") + 1)\n\t\t$dateStr = $_.Name.Substring(0, $_.Name.IndexOf(\"_\"))\n\t\t$date = [DateTime]::ParseExact($dateStr.Substring(0, 12), \"yyyyMMddHHmm\", $null)\n\n\t\t$_ | Select-Object -Property `\n\t\t\t@{l='Index';e={\"$idx\"}}, `\n\t\t\t@{l='Name'; e={$migrationName}}, `\n\t\t\t@{l='Created'; e={$date.ToString(\"g\")}}, `\n\t\t\t@{l='FullName'; e={$_.Name}}\n\n\t\t$idx -= 1\n\t}\n}\n\nfunction Update-RealDatabase([int]$targetMigration = 0) {\n\t$project = Get-DbContextProject\n\tif ($targetMigration -eq 0) {\n\t\t# Default: Update to latest migration\n\t\tUpdate-Database -Project $project.ProjectName\n\t} else {\n\t\t# With negative number: Go to x last created migration\n\t\t$migration = Get-MigrationsTable | Where-Object {$_.Index -eq $targetMigration}\n\t\techo \"Migrating to last migration $targetMigration =&gt; $($migration.name)\"\n\t\tUpdate-Database -Project $project.ProjectName -TargetMigration $migration.name\n\t}\n}\n\nfunction Test-MigrationName($fileName) {\n\treturn $fileName -match \"^(d[^.]+).(cs|vb)$\"\n}\n<\/code><\/pre>\n<hr \/>\n<h1 id=\"open-the-package-manager-console-in-visual-studio\">Open the Package Manager Console in Visual Studio<\/h1>\n<p>Menu: Tools &gt; NuGet Package Manager &gt; Package Manager Console<br \/> Shortcut: Alt + T, N, O<br \/> Custom shortcut: View.PackageManagerConsole<\/p>\n<h1>Extras<\/h1>\n<p><b>Stuff that came into being during the making of this post<\/b><\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Laoujin\/dotfiles\/blob\/master\/config\/PowerShell\/scripts\/nuget\/ef.ps1\">The EF nuget profile<\/a><\/li>\n<\/ul>\n<h1>Updates<\/h1>\n<ul>\n<li> 28 March 2018: Fix for Visual Studio 2017<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial is about adding the following functionality to the Entity Framework Migrations CLI:<\/p>\n<ul>\n<li>Execute commands against the project containing the migrations by providing the most likely -Project parameter value<\/li>\n<li>Allow updating the database using a numeric TargetMigration (-2 = migrate to the third last migration)<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":2124,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[5],"tags":[9],"class_list":["post-1709","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev-setup","tag-powershell"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Package Manager Console Entity Framework 6 Migrations profile - Itenium<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Package Manager Console Entity Framework 6 Migrations profile - Itenium\" \/>\n<meta property=\"og:description\" content=\"This tutorial is about adding the following functionality to the Entity Framework Migrations CLI:Execute commands against the project containing the migrations by providing the most likely -Project parameter valueAllow updating the database using a numeric TargetMigration (-2 = migrate to the third last migration)\" \/>\n<meta property=\"og:url\" content=\"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/\" \/>\n<meta property=\"og:site_name\" content=\"Itenium\" \/>\n<meta property=\"article:published_time\" content=\"2018-03-27T20:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-28T12:31:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/powershell-migrations-profile.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"360\" \/>\n\t<meta property=\"og:image:height\" content=\"240\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Usdevelop\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Usdevelop\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/\",\"name\":\"Package Manager Console Entity Framework 6 Migrations profile - Itenium\",\"isPartOf\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/powershell-migrations-profile.jpg\",\"datePublished\":\"2018-03-27T20:00:00+00:00\",\"dateModified\":\"2025-11-28T12:31:47+00:00\",\"author\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\"},\"breadcrumb\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#primaryimage\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/powershell-migrations-profile.jpg\",\"contentUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/powershell-migrations-profile.jpg\",\"width\":360,\"height\":240},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/demo.sidekick.be\/itenium\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Package Manager Console Entity Framework 6 Migrations profile\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/\",\"name\":\"Itenium\",\"description\":\"We build software. We build careers.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\",\"name\":\"Usdevelop\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"caption\":\"Usdevelop\"},\"sameAs\":[\"https:\/\/demo.sidekick.be\/itenium\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Package Manager Console Entity Framework 6 Migrations profile - Itenium","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"Package Manager Console Entity Framework 6 Migrations profile - Itenium","og_description":"This tutorial is about adding the following functionality to the Entity Framework Migrations CLI:Execute commands against the project containing the migrations by providing the most likely -Project parameter valueAllow updating the database using a numeric TargetMigration (-2 = migrate to the third last migration)","og_url":"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/","og_site_name":"Itenium","article_published_time":"2018-03-27T20:00:00+00:00","article_modified_time":"2025-11-28T12:31:47+00:00","og_image":[{"width":360,"height":240,"url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/powershell-migrations-profile.jpg","type":"image\/jpeg"}],"author":"Usdevelop","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Usdevelop","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/","url":"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/","name":"Package Manager Console Entity Framework 6 Migrations profile - Itenium","isPartOf":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#website"},"primaryImageOfPage":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#primaryimage"},"image":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#primaryimage"},"thumbnailUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/powershell-migrations-profile.jpg","datePublished":"2018-03-27T20:00:00+00:00","dateModified":"2025-11-28T12:31:47+00:00","author":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022"},"breadcrumb":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#primaryimage","url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/powershell-migrations-profile.jpg","contentUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/powershell-migrations-profile.jpg","width":360,"height":240},{"@type":"BreadcrumbList","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/dev-setup\/package-manager-console-ef-migrations\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/demo.sidekick.be\/itenium\/"},{"@type":"ListItem","position":2,"name":"Package Manager Console Entity Framework 6 Migrations profile"}]},{"@type":"WebSite","@id":"https:\/\/demo.sidekick.be\/itenium\/#website","url":"https:\/\/demo.sidekick.be\/itenium\/","name":"Itenium","description":"We build software. We build careers.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022","name":"Usdevelop","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","caption":"Usdevelop"},"sameAs":["https:\/\/demo.sidekick.be\/itenium"]}]}},"_links":{"self":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1709","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/comments?post=1709"}],"version-history":[{"count":3,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1709\/revisions"}],"predecessor-version":[{"id":2325,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1709\/revisions\/2325"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media\/2124"}],"wp:attachment":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media?parent=1709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/categories?post=1709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/tags?post=1709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}