для типа dbcontext не определен конструктор без параметров - PullRequest
1 голос
/ 12 июля 2020

Я ищу много сообщений в стеке и других сайтах об этой ошибке, но это был не мой ответ, это мой DbCintext

[Table("AspNetUsers")]
public class ApplicationUser : IdentityUser { }

public class EMSContext : IdentityDbContext<ApplicationUser> {
   

    public EMSContext (DbContextOptions<EMSContext> options) : base (options) { }

    public DbSet<Ambulance> Ambulances { get; set; }
 }

, а это mu StartUp.cs

 services.AddControllers();
        
        services.AddDbContext<EMSContext>(options =>
          options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

но когда я хочу сгенерировать контроллер api, я получил эту ошибку

для типа dbcontext не определен конструктор без параметров

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

Ошибка очевидна, у вас нет конструктора без параметров.

Но при этом инструментарий не должен нуждаться в , так как вы вызываете 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 могут возникать, если разрешение / конфигурация службы не удается из-за нахождения в «неправильной» среде. Это одна из причин, по которой существует решение фабрики контекста.

0 голосов
/ 12 июля 2020

Ошибка точно находится в этой строке:

public EMSContext (DbContextOptions<EMSContext> options) : base (options) { }

Никаких конструкторов без параметров для DbContext ... конечно, потому что ваш конструктор принимает один параметр DbContextOptions options,

, поэтому у вас есть два варианта исправить это, исправить вызов конструктора или заставить конструктор принимать 0 параметров

...