On a DEV machine, Entity Framework Migrations can be executed very easily using the the Update-Database command in Package Manager Console.
Naturally, we do have a Continuous Integration (CI) server that builds and integrates the checked-in code. We needed to run the migrations on the CI server as well. For building our project we were using MSBuild. I wanted to integrate Entity Framework Migrations with MSBuild so that the migrations can be executed outside the Visual Studio and on the CI server as well.
Looked like a no brainier task to me, I hoped that there will be an MSBuild task that would run the Entity Framework Migrations and my job would be done! But to my surprise, Entity Framework Migrations is not fully thought through, it does not come with any task for MSBuild which can be executed out of the box.
Turns out that there is a Migrate.exe that could be used to execute the migrations. This could then be invoked from MSBuild to get the job done. So how do they do it, how to run Entity Framework Migrations using MSBuild and Migrate.exe
How do they do it!
- Migrate.exe can be found under the tools directory of the Entity Framework package that comes along with NuGet.
- We could create a simple task that can invoke migrate.exe using the Exec MSBuild task.
- However, simply running the above task will not get your the desired results. When you run this task you might end up getting some weird exception. I got the following exception
- Turns out that to successfully run Migrate.exe, it needs to be copied to the directory where the DLL holding all the Entity Framework Migrations is located.
- I don't understand why such a restriction is necessary. Why could they not use the StartUpDirectory parameter or some other parameter to accept the full directory path of the DLL that has the migrations. May be when someone wrote the code for Migrate.exe, he/she found it convenient to run it this way!
- Anyways, so the fix to this problem was simple, first copy the Migrate.exe to the folder where the DLL is located and then run the Migrate.exe
- Updated target code looks as follows.