Каков правильный формат для запуска инструмента Entity Framework migrate.exe без файла Web/App.config?

Недавно мы перешли на миграцию данных Entity Framework, и я работаю над некоторыми сценариями автоматизации сборки для нашего приложения MVC. Я могу успешно выполнить миграцию с нашего сервера сборки с помощью инструмента migrate.exe в версии 4.3, если у меня есть файл Web.config, на который можно указать его. Команда выглядит примерно так:

ProjectName\packages\EntityFramework.4.3.1\tools\migrate.exe MyAssembly
    /startupdirectory:ProjectName\bin\Debug 
    /startupconfigurationfile:ProjectName\Web.config 
    /verbose

Однако по разным причинам я хотел бы избежать использования Web.config и просто передать правильную строку подключения во время миграции:

ProjectName\packages\EntityFramework.4.3.1\tools\migrate.exe MyAssembly
    /startupdirectory:ProjectName\bin\Debug 
    /connectionString:"Data Source=awesomeserver;Initial Catalog=awesomedatabase;User Id=funkyuser;Password=crazypassword" 
    /verbose

Это не работает. Хуже того, миграция.exe завершается с ошибкой NullReferenceException. Строка подключения идентична той, которую мы используем в нашем Web.config.

Кто-нибудь сталкивался с этим раньше? Неверный ли формат строки подключения? Ошибка?


person jslatts    schedule 14.03.2012    source источник


Ответы (2)


Ок, мы разобрались. При работе без Web.config параметр connectionProviderName также должен быть передан:

ProjectName\packages\EntityFramework.4.3.1\tools\migrate.exe MyAssembly
    /startupdirectory:ProjectName\bin\Debug 
    /connectionProviderName:"System.Data.SqlClient"
    /connectionString:"Data Source=awesomeserver;Initial Catalog=awesomedatabase;User Id=funkyuser;Password=crazypassword" 
    /verbose

Я подтвердил, что это работает.

person jslatts    schedule 14.03.2012
comment
+1 Получение исключения NullPointerException для отсутствующего параметра по-прежнему неверно - я не уверен, есть ли сайт подключения для EF, но если есть, сообщите им об этом! Спасибо! - person Rup; 15.03.2012

Мне еще предстоит найти решение, которое действительно работает без указания файла web/app.config. Смотри ниже.

Однако если вы можете согласиться с предоставлением файла web/app.config и переопределением строки подключения в качестве параметров командной строки, то следующее работает с nuget Entity Framework 5.0 и .NET 4.5. Также должно работать для .NET 4.0 с задокументированными обходными путями.

Пример структуры папок:

trunk\MySolution.sln
trunk\run_migration.bat

trunk\MyMvc4App\MyMvc4App.csproj 
trunk\MyMvc4App\web.config

trunk\MyMvc4App\bin\MyMvc4App.dll
trunk\MyMvc4App\bin\EntityFramework.dll

trunk\packages\EntityFramework.5.0.0\tools\migrate.exe

run_migration.bat:

SET AssemblyName=MyMvc4App
SET StartUpDirectory=MyMvc4App\bin\
SET ConnectionString=Server=tcp:XXXX.database.windows.net,1433;Database=XXXX;User ID=XXXX;Password=XXXX;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;MultipleActiveResultSets=True
SET ConnectionStringProvider=System.Data.SqlClient
SET ConfigFilePath=%CD%\MyMvc4App\web.config
SET MigrateExe=packages\EntityFramework.5.0.0\tools\migrate.exe

%MigrateExe% %AssemblyName%.dll /startUpDirectory:%StartUpDirectory% /startUpConfigurationFile:"%ConfigFilePath%" /connectionProviderName:"%ConnectionStringProvider%" /connectionString:"%ConnectionString%" /verbose
pause

Конец решения.


Исключение файла конфигурации:

При попытке опустить файл конфигурации я всегда получал следующее исключение, независимо от того, что я пробовал. Я не пробовал EF 4.3, поэтому подозреваю, что поведение изменилось между 4.3 и 5.0.

System.Data.Entity.Migrations.Design.ToolingException: Exception has been thrown by the target of an invocation.
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.Console.Program.Run()
   at System.Data.Entity.Migrations.Console.Program.Main(String[] args)
ERROR: Exception has been thrown by the target of an invocation.
person angularsen    schedule 03.01.2013
comment
Я сделал точно так же, как вы здесь, но я получаю вашу ОШИБКУ: в любом случае, цель вызова с идентичной трассировкой стека вызвала исключение. Migrate.exe кажется действительно самым низким качеством. - person bwerks; 03.02.2014
comment
Кажется, есть некоторая проблема с относительными путями. stackoverflow.com/questions/28724546/ - person thepaulpage; 24.04.2015
comment
У меня была аналогичная проблема, но оказалось, что мой код (через ConfigurationManager.ConnectionStrings), а не EF, требовал фиктивного файла конфигурации. Я предлагаю дважды проверить это. - person Jesper Mygind; 25.10.2017