Debug code-first Entity Framework migration codes
Solution 1
I know that EF Code First Migrations is relatively new tool but don't forget about you are still in .NET.
So you can use:
if (System.Diagnostics.Debugger.IsAttached == false)
{
System.Diagnostics.Debugger.Launch();
}
After that you can see your InnerException.
Or you can use try...catch statement like this: Exception handling Entity Framework
Solution 2
To hit a break point in a db migration set the context to MigrateDatabaseToLatestVersion on initialise.
Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());
Then you just debug as normal (run using f5) and the breakpoint will hit the first time you run the project.
The problem now is that if you debug a second time the migration will not run. This is because the __MigrationHistory table has been updated to say you have migrated to the latest version. To re-test the migration open the package manager console and downgrade to the previous migration:
Update-Database –TargetMigration: ThePreviousMigrationName
Solution 3
My answer might be a bit silly but anyway here it goes. If you, like me, some times have problems in the Seed() method what I usually do is simply create a public method that calls the Protect Seed().
public void SeedDebug(AppDbContext context)
{
Seed(context);
}
then in my HomeController I call this method in Debug mode.
public class HomeController : Controller
{
var appDb = new AppDbContext();
public ActionResult Index()
{
var config = new Configuration();
config.SeedDebug(appDb);
return View();
}
}
I know it's a bit lame solution, but it's simple and quick. Of course this has to be done after the model been created. So step by step:
- comment the seed method and execute the update-database to create the model
uncomment the method Seed() and plugin the "hack" I mentioned above.
-
in the configuration disable Auto migrations
AutomaticMigrationsEnabled = false;//if you have this disabled already skip this step
Debug your application, fix the error and remove the "hack"
Solution 4
Here's a more fail-proof method which will do the trick without much fuss:
Step#1: Place this piece of code right above the migration you want to debug:
public partial class ORACLE_Test : DbMigration
{
public override void Up()
{
if (!System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Launch();
AddColumn("TEST", "UR_USER_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
AddColumn("TEST", "UR_CLIENT_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
[...]
}
public override void Down()
{
}
}
Step#2: Compile the project containing your migrations
Step#3: Open a console inside the output directory (/bin/Debug, /bin/Release etc) containing the dll of your migrations
Step#4: Invoke migrate.exe with the /scriptFile parameter to launch the debugger and actually debug the desired db-migration
migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"
Once the debugger-selector dialog pops up pick the visual studio instance that you have already opened.
Solution 5
You could add Console.WriteLine statements to the migration code (not a great solution)
Note, the messages are only shown if you run the migration code using the migrate.exe
utility (in pacakges\EntityFramework.x.y.z\tools
). They will not display if you run the migration through the Package Manager console.
Related videos on Youtube
Daniel
Updated on July 08, 2022Comments
-
Daniel almost 2 years
I'm using Entity Framework code first in my website and I'm just wondering if there is any way to debug the migration codes. You know, like setting breakpoints and stuff like this.
I'm using Package Manager Console to update the database using
Update-Database
.Thanks
-
marc_s almost 11 yearsIt's just standard C# code - so yes, of course, you can set breakpoints in it.....
-
Daniel almost 11 yearsbut the application is not actually running since I'm using Package Manager Console.
-
Wiktor Zychla almost 11 yearsThen do not upgrade from Package manager console but set the migration initializer as the default initializer so that the database is migated the first time your application connects to it.
-
Daniel almost 11 yearsI'm updating my database by using the migration code and I can't stop the app and run it again to run the initializer.
-
Daniel almost 11 yearsThe reason I'm not using SQL is the code for the updating is rather complicated and it's almost impossible to implement it using SQL.
-
-
Daniel almost 11 yearsThanks Tom... It was the closest answer I could get. If no one answers this with a better solution I'm going to mark it as answer. :)
-
Daniel almost 11 yearsThx m_david. I haven't had time to test this. I caught up in an android project. I'll test this when I have time to go back to my MVC website.
-
Tom Ferguson almost 11 yearsYes, this works while running an Update-Database through the package manager console. Very handy!
-
Talon over 10 yearsI added this to the top of my Configuration.Seed method. It causes a popup that lets you select your Visual Studio to debug the code. However, my system hangs when I select it (perhaps unrelated).
-
Aritra B about 10 yearsWhere to put this piece of code? if anyone can help out! Thanks.
-
Priya Narayanan about 10 yearsOr throw an Exception with your message that you want to return.
-
Casey about 10 yearsIn the constructor of your configuration class.
-
Corstian Boerman almost 10 years@Talon Go grab a coffee and by the time you're back probably another Visual Studio instance popped up. :)
-
Daniel almost 10 yearsIt's not what I meant but it sure helps.
-
Jeff almost 7 yearsCan someone edit the answer to provide a complete solution as if they were explaining it to a rubber duck? (I'm about as smart as a rubber duck). E.g. 1) start the debugger. 2) set breakpoint 3.) add code to construtor, 4) run
update-database
in console, etc -
XDS over 5 yearsTo which process are you attaching to?
-
Mariusz Pawelski over 5 yearsGreat answer but It's worth noting that if you add this code to Seed method, compile, and then run migration through migrate.exe utility you'll actually get windows where you can choose the already opened Visual Studio and then debug there. However If you try to do migration in Visual Studio through "Package Manager Console" and "Update-Database" command you would only get option to open new Visual Studio.
-
Matt about 3 yearsIt is working fine, thank you! Note: It should be placed in the constructor of the context factory class (of type IDesignTimeDbContextFactory, where you have your
MyDbContext IDesignTimeDbContextFactory<MyDbContext >.CreateDbContext(string[] args)
) - and I suggest to surround it with#if DEBUG ... (code from answer) ... #endif
to avoid having it in production deployments. You need to add that code only once, it activates subsequent breakpoints.