Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

enable-migrations in x64 Project gets System.BadImageFormatException

Tags:

I have a project set to x64 (it's using some Nuget packages that are 64-bit only). Everything runs and deploys fine, but trying to run EF's enable-migrations at the Package Manager Console gets me a System.BadImageFormatException. The full exception:

PM> enable-migrations System.BadImageFormatException: Could not load file or assembly  or one of its dependencies. An attempt was made to load a program with an incorrect format. File name:     at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)    at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)    at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)    at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)    at System.Reflection.Assembly.Load(String assemblyString)    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.LoadAssembly(String name)    at System.Data.Entity.Migrations.Design.ToolingFacade.GetContextTypeRunner.Run()    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)    at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)    at System.Data.Entity.Migrations.Design.ToolingFacade.GetContextType(String contextTypeName)    at System.Data.Entity.Migrations.EnableMigrationsCommand.FindContextToEnable(String contextTypeName)    at System.Data.Entity.Migrations.EnableMigrationsCommand.<>c__DisplayClass2.<.ctor>b__0()    at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)  WRN: Assembly binding logging is turned OFF. To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1. Note: There is some performance penalty associated with assembly bind failure logging. To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].  Could not load file or assembly  or one of its dependencies. An attempt was made to load a program with an incorrect format. 

Note: I've removed the project name from the error message, both to make this easier to google and because it's irrelevant to this problem.

like image 447
Chris Moschini Avatar asked May 14 '14 23:05

Chris Moschini


People also ask

What does enable-migrations do?

Enable Code First Migrations. The Migrations feature enables you to change the data model and deploy your changes to production by updating the database schema without having to drop and re-create the database.

Can't load file or assembly migrations?

Could not load assembly 'Registry'. (If you are using Code First Migrations inside Visual Studio this can happen if the startUp project for your solution does not reference the project that contains your migrations. You can either change the startUp project for your solution or use the -StartUpProjectName parameter.)


1 Answers

The problem is that the enable-migrations command appears to have a hard-coded path where EF looks for built DLLs of your project at /bin/Debug, no matter what the actual build path is. When you change a Project to x64, Visual Studio quietly changes your project's build path to /bin/x64/Debug - while EF keeps looking in /bin/Debug. That causes this vague System.BadImageFormatException.

It's harmless to just change your Project build path to /bin/Debug and magically, everything begins working like it's supposed to.

Bug exists up to and including EF 6.1.0. Bug report posted.

Update: Microsoft has decided not to bother fixing the bug, closed as wontfix, because a workaround exists. Pretty bad behavior.

like image 118
Chris Moschini Avatar answered Sep 16 '22 18:09

Chris Moschini