Ошибка очевидна, у вас нет конструктора без параметров.
Но при этом инструментарий не должен нуждаться в , так как вы вызываете AddDbContext
и передаете ваша строка подключения. Контроллеры инструментальных лесов / эт c. фактически запустив вашу программу, а затем запросив DbContext
у поставщика услуг хоста. Он делает это путем поиска методов с очень конкретными c именами .
Я предполагаю, что ваш основной Program.cs
не соответствует предписанному шаблону и, следовательно, не может построить ваш Host
и не найти его ServiceProvider
.
Возможны следующие варианты (мой личный выбор - # 2):
- Добавить конструктор без параметров, как указано в сообщении
- Убедитесь, что ваша основная точка входа использует правильные соглашения для методов компоновщика хоста
- Создайте фабрику контекста времени разработки
Конструктор без параметров
Это очевидное ответ, хотя это не всегда возможно. Кроме того, в этом нет необходимости, поскольку у строительных лесов есть другие средства для чтения из вашего DbContext
. Добавление конструктора только для этой цели - это не то, что я бы ни делал, ни рекомендовал бы. ваша программа. По сути, он ищет что-то вроде этого:
public class Program
{
public static void Main(string[] args)
=> CreateHostBuilder(args).Build().Run();
// EF Core uses this method at design time to access the DbContext
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(
webBuilder => webBuilder.UseStartup<Startup>());
}
Теперь ему не нужно выглядеть именно так . Важной частью является имя и подпись метода CreateHostBuilder
. *
Если при попытке создания службы возникают какие-либо ошибки, например, из-за наличия зависимостей, которые не могут быть решено или конфигурация отсутствует, этот метод не сработает. Я почти уверен, что вы получите ту же ошибку или ошибку, связанную с DI. **
Design Time Factory
Предположим, что по-прежнему не работает или если вам нужен лучший контроль, вы можете создать Design-Time Factory для своего контекста. Инструмент просканирует ваш проект на предмет типов, реализующих IDesignTimeDbContextFactory<EMSContext>
, а затем будет использовать это во время построения лесов:
public class EMSContextFactory : IDesignTimeDbContextFactory<EMSContext>
{
public EMSContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<EMSContext>();
optionsBuilder.UseSqlServer("Your Connection String");
return new EMSContext(optionsBuilder.Options);
}
}
См. эту ссылку для получения дополнительной информации.
* Примечание. Вы не указали, какую версию ядра pnet вы используете. Если вы не используете generi c host (Host.CreateDefaultBuilder
), а вместо этого используете WebHost
, то ожидаемая сигнатура метода будет выглядеть немного иначе. Тем не менее, он будет соответствовать созданию нового проекта с теми же настройками.
Если вы когда-либо писали интеграционные тесты для своих контроллеров, WebApplicationFactory
ищет похожие методы / сигнатуры. Те же подписи должны удовлетворять подмостки контроллера. Кажется, я не могу найти документацию ни по одной другой ссылке, кроме приведенной выше.
** Когда леса работают, они работают как среда «Производство». Ошибки DI могут возникать, если разрешение / конфигурация службы не удается из-за нахождения в «неправильной» среде. Это одна из причин, по которой существует решение фабрики контекста.