После обновления до ASP.NET Core 2.0 я больше не могу создавать миграции.
я собираюсь
«Произошла ошибка при вызове метода BuildWebHost в классе Program. Продолжение без поставщика службы приложений. Ошибка: произошла одна или несколько ошибок. (Невозможно открыть базу данных« ... », запрошенную именем входа. Ошибка входа в систему. Вход не удалось для пользователя '...' "
и
«Невозможно создать объект типа MyContext. Добавьте реализацию IDesignTimeDbContextFactory в проект или см. Https://go.microsoft.com/fwlink/?linkid=851728 для дополнительных шаблонов, поддерживаемых во время разработки».
Ранее я выполнял команду $ dotnet ef migrations add InitialCreate --startup-project "..\Web"
(из проекта / папки с DBContext).
Строка подключения: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"
Это мой Program.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Ответы:
Вы можете добавить класс, реализующий IDesignTimeDbContextFactory внутри вашего веб-проекта.
Вот пример кода:
Затем перейдите в проект базы данных и выполните из командной строки следующее:
ресурс
источник
Нет необходимости в
IDesignTimeDbContextFactory
.Бегать
add-migration initial -verbose
это раскроет детали под
предупреждение, которое является основной причиной проблемы.
В моем случае проблема заключалась в наличии
ApplicationRole : IdentityRole<int>
и вызове,services.AddIdentity<ApplicationUser, IdentityRole>()
которые вызывали ошибку нижеисточник
Решение 1. (Найдите проблему в 99% случаев)
Установить проект веб-приложения как запускаемый проект
Выполните следующие команды с
-verbose
опцией.Решение 2:
Переименуйте
BuildWebHost()
вCreateWebHostBuilder()
, потому чтоEntity Framework Core tools
ожидайте найтиCreateHostBuilder
метод, который настраивает хост без запуска приложения..NET Core 2.2
.NET Core 3.1
Переименовать
BuildWebHost()
вCreateHostBuilder()
Решение 3:
Убедитесь, что вы добавили
Dbcontext
к внедрению зависимостей:AddDbContext<TContext>
и ваш тип DbContextTContext
, и соответствующий ему будутDbContextOptions<TContext>
доступны для внедрения из контейнера службы. Это требует добавления аргумента конструктора к вашемуDbContext
типу, который принимаетDbContextOptions<TContext>
.Пример: в Startup.cs
Код AppDbContext :
источник
public static IWebHostBuilder BuildWebHost(string[] args)
кpublic static IWebHost BuildWebHost(string[] args)
с.Build()
теперь включены в функцииIDesignTimeDbContextFactory
Просто переименуйте
BuildWebHost()
вCreateWebHostBuilder()
, потому что при миграции по умолчанию используется этот метод.источник
В моем случае причиной проблемы было несколько запускаемых проектов. В моем решении есть три проекта: Mvc, Api и Dal. DbContext и миграции в проекте Dal.
Я настроил несколько запускаемых проектов. Когда я нажал кнопку «Пуск», были запущены проекты Mvc и Api. Но в этом случае я получал эту ошибку.
Я смог успешно добавить миграцию после установки Mvc в качестве единственного запускаемого проекта и выбора Dal в консоли диспетчера пакетов.
источник
В AppContext.cs помимо класса AppContext добавьте еще один класс:
Это решит вашу вторую проблему:
После этого вы сможете добавить начальную миграцию и выполнить ее, выполнив команду update-database . Однако, если выполнить эти команды, когда на вашем локальном сервере SqlServer еще нет базы данных, вы получите предупреждение, подобное вашей первой ошибке: «Ошибка
Но это не ошибка, потому что миграция будет создана, и ее можно будет выполнить. Так что просто проигнорируйте эту ошибку в первый раз, и, поскольку Db будет существовать, больше не повторится.
источник
пожалуйста, убедитесь, что у вас есть ссылка
источник
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
что включает эту ссылку. Я попытался также включить вышеупомянутое, но без изменений.Вы можете попробовать это решение из этого обсуждения , которое было вдохновлено этим сообщением .
источник
Мне действительно помогла эта статья: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/
Основная идея состоит в том, что при переходе с .net core 1 на 2 все инициализации db должны быть перенесены из StartUp.cs в Program.cs. В противном случае задачи EF пытаются запустить вашу базу данных при выполнении задач.
«В официальных документах по миграции ( https://docs.microsoft.com/en-us/ef/core/miscellaneous/1x-2x-upgrade ) есть хороший раздел под названием« Переместить код инициализации базы данных », который, похоже, у меня есть пропущено. Поэтому, прежде чем вы отправитесь в кроличьи норы, как я, убедитесь, что это не то, что вызывает у вас необходимость добавить реализацию IdesignTimeDbContextFactory. "
источник
Из
https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation
Добавить Factory в .Net Core 2.x
источник
У меня была эта проблема, и она была решена с помощью Set -> Web Application (Included Program.cs) Project to -> Set as Startup Project »
Затем запустите -> add-migration initial -verbose
в консоли диспетчера пакетов
Установить как запускаемый проект
источник
Если вы хотите избежать этой вещи IDesignTimeDbContextFactory: просто убедитесь, что вы не используете какой-либо метод Seed в своем запуске. Я использовал статический метод начального значения в своем запуске, и это вызывало у меня эту ошибку.
источник
Ранее вы настраивали исходные данные в методе Configure в Startup.cs. Теперь рекомендуется использовать метод Configure только для настройки конвейера запросов. Код запуска приложения принадлежит методу Main.
Реорганизованный метод Main. Добавьте следующие ссылки в Program.cs:
using Microsoft.Extensions.DependencyInjection;
using MyProject.MyDbContextFolder;
источник
Есть проблема с ef seeding db из Startup.Configure в 2.0 ... вы все еще можете сделать это с помощью этой работы. Протестировано и работает нормально
https://garywoodfine.com/how-to-seed-your-ef-core-database/
источник
В моем случае , я получил эту проблему , потому что у меня был метод , называемый SeedData.EnsurePopulated () вызываются на моем Startup.cs файл.
Работа класса SeedData заключается в добавлении исходных данных в таблицу базы данных. Это код:
РЕШЕНИЕ
Перед выполнением миграции просто закомментируйте вызов класса SeedData в файле Startup.cs .
Это решило мою проблему, и надеюсь, что ваша проблема также решена таким же образом.
источник
Я столкнулся с той же проблемой. У меня в решении два проекта. который
Изначально проект API был задан как Startup project.
Я изменил проект Startup на тот, который содержит классы контекста. если вы используете Visual Studio, вы можете установить проект как запускаемый:
источник
Прежде всего убедитесь, что вы настроили свою базу данных в
Startup.cs
моем случае, я получал эту ошибку, так как я не указал ниже вStartup.cs
источник
Использование ASP.NET Core 3.1 и EntityFrameWorkCore 3.1.0. Переопределение OnConfiguring класса контекста только с помощью конструктора без параметров
источник
Я столкнулся с ошибкой
«Невозможно создать объект типа MyContext. Добавьте реализацию IDesignTimeDbContextFactory в проект или см. Https://go.microsoft.com/fwlink/?linkid=851728 для дополнительных шаблонов, поддерживаемых во время разработки».
Так решилась моя проблема. Выполните приведенную ниже команду, находясь в каталоге решения.
Здесь Application - мой стартовый проект, содержащий класс Startup.cs, а Infrastructure - мой проект, содержащий класс DbContext.
затем запустите обновление, используя ту же структуру.
источник
У меня такая же проблема, так как я имел в виду старую - Microsoft.EntityFrameworkCore.Tools.DotNet
После обновления до более новой версии проблема решилась.
источник
В файле appsettings.json основного проекта я установил «Копировать в выходной каталог» на «Копировать всегда», и это сработало.
источник
Пример класса контекста БД для основных консольных приложений .net
источник
Вы также можете использовать в конструкторе класса запуска, чтобы добавить файл json (в котором находится строка подключения) в конфигурацию. Пример:
источник
Для меня это было потому, что я изменил
Output Type
свой стартап-проект сConsole Application
наClass Library
.Возврат к
Console Application
сработал.источник
У меня была эта проблема в решении, в котором есть:
Я получаю сообщение «невозможно создать объект ...», когда проект Blazor установлен как запускаемый, но не, если проект MVC установлен как запускаемый проект.
Это меня озадачивает, потому что в консоли диспетчера пакетов (где я создаю миграцию) у меня есть проект по умолчанию, установленный на библиотеку классов C #, которая фактически содержит контекст БД, и я также указываю контекст БД в мой призыв добавить-миграцию
add-migration MigrationName -context ContextName
, поэтому кажется странным, что Visual Studio заботится о том, какой запускаемый проект сейчас установлен.Я предполагаю, что причина в том, что когда проект Blazor является запускаемым проектом, PMC определяет версию .NET как Core 3.0 из запускаемого проекта, а затем пытается использовать это для запуска миграции в классе .NET Standard 2.0. библиотека и столкновение с каким-то конфликтом.
Независимо от причины, изменение запускаемого проекта на проект MVC, ориентированный на Core 2.2, а не на проект Blazor, устранило проблему.
источник
Для меня проблема заключалась в том, что я запускал команды миграции не в том проекте. Выполнение команд внутри проекта, содержащего Startup.cs, а не проекта, содержащего DbContext, позволило мне обойти эту конкретную проблему.
источник
В моем случае помогает установка проекта StartUp в init. Вы можете сделать это, выполнив
источник
У меня была такая же проблема. Просто изменил ap.jason на application.jason, и проблема устранилась.
источник