Я создаю приложение в ASP.NET Core 2.0, и у меня возникают проблемы с миграцией EntityFramework.
У меня DbContext находится в отдельном проекте (SolutionName \ ProjectNamePrefix .Data), поэтому я создал реализацию для интерфейса IDesignTimeDbContextFactory.
Я хотел использовать разные строки подключения для разных сред, и для этого мне нужен appsettings.json
.
Итак, после быстрого поиска я обнаружил, что могу создать новый объект IConfigurationRoot
внутри функции CreateDbContext
, как показано здесь: https://codingblast.com/entityframework-core-idesigntimedbcontextfactory/
Я добавил это, а затем для тестирования попытался запустить dotnet ef migrations list -c MyContext
из корневой папки проекта данных.
Затем я получил следующую ошибку:
The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\dev\*SolutionName*\*ProjectNamePrefix*.Data\bin\Debug\netcoreapp2.0\appsettings.json'.
Итак, в основном я попробовал 3 варианта получения правильного корневого пути:
Directory.GetCurrentDirectory();
env.ContentRootPath;
(IHostingEnvironment
объект, я нашел способ получить его здесь: https://github.com/aspnet/Home/issues/2194)AppDomain.CurrentDomain.BaseDirectory;
и все они вернули один и тот же путь ..\bin\debug\netcoreapp2.0\
. Когда я запускаю проект Data из VS, два первых варианта дают мне правильную корневую папку проекта.
Есть ли способ получить правильную корневую папку с содержимым проекта?
Потому что, когда я добавил --verbose к команде EF, она вышла из системы:
Using content root 'C:\dev\FitsMeIdentity\FitsMeIdentity.Data\'.
Итак, я понимаю, что EF каким-то образом знает корень проекта, но все параметры, упомянутые выше, возвращают путь для уже созданного приложения.
Единственный работающий вариант, который я нашел, - это то, что я меняю Copy output to root folder
на Copy always
, но нашел здесь: https://www.benday.com/2017/02/17/ef-core-migrations-without-hard-coding-a-connection-string-using-idbcontextfactory/, что это плохая идея.
Сначала я даже подумал о создании конструктора для реализации IDesignTimeDbContextFactory, который получает IOptions в качестве параметра, но это не сработало, возникла та же проблема, что и здесь: Внедрение строки Env Conn в .NET Core 2.0 с EF Core DbContext в разных class lib, чем Startup prj, и реализация IDesignTimeDbContextFactory