Настройте ASP.NET Core с Entity Framework: «Для этого DbContext не настроен поставщик базы данных» - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь внедрить простую строку подключения в проекте ASP.NET Core 2.1 API.

appsettings.json:

{
    "ConnectionStrings": {
        "DefaultConnection": "Server=xxx.database.windows.net;Database=xxx;User Id=frontend;Password=xxx;"
    }
}

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    var connStr = Configuration.GetConnectionString("DefaultConnection");
    services.AddDbContext<DB>(options => options.UseSqlServer(connStr));

DbContext:

public class DB : DbContext
{
    public DB(DbContextOptions<DbContext> options) : base(options) { }
    public DB() { }

    public DbSet<MenuItem> MenuItemList { get; set; }
}

Мой контроллер:

public class MenuItemsController : ControllerBase
{
    DB _context;
    public MenuItemsController(DB context)
    {
        _context = context;
    }

    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        try
        {
            var ddd = _context.MenuItemList.ToList();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        return new string[] { "value1", "value2" };
    }
}

Я получаю следующую ошибку:

Для этого DbContext не настроен поставщик базы данных.

Строка подключения правильно читается из файла appsettings, я что-то упустил?Я читал другие посты, где люди просто настраивают часть соединения в контексте БД, но я бы предпочел сделать это с помощью инъекций.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Это два конструктора в типе контекста вашей базы данных DB:

public DB(DbContextOptions<DbContext> options) : base(options) { }
public DB() { }

Поэтому, когда контейнер внедрения зависимостей пытается разрешить контекст базы данных, он просматривает эти конструкторы и пытается определить, какиеконструктор для создания объекта.

Сначала он будет смотреть на объект, ожидающий аргумент DbContextOptions<DbContext>.Обычно DbContextOptions автоматически регистрируются как часть вызова AddDbContext<T>().Однако зарегистрированными типами являются DbContextOptions (неуниверсальный) и DbContextOptions<T>.

Так что в вашем случае для контекста базы данных DB только типы DbContextOptions и DbContextOptions<DB>

Таким образом, контейнер внедрения зависимостей не может разрешить DbContextOptions<DbContext> и поэтому не может использовать этот конструктор.Таким образом, он будет использовать следующий конструктор, который оказывается пустым конструктором.Поскольку пустой конструктор не поддерживает какую-либо конфигурацию, контекст базы данных будет ненастроенным, и при попытке его использовать вы получите эту ошибку.

Решение довольно простое: отрегулируйте тип DbContextOptions<> в этом конструкторе.Вы можете использовать DbContextOptions или DbContextOptions<DB>.Последнее, как правило, предпочтительнее, поскольку позволяет вам иметь несколько контекстов базы данных в одном приложении, но если у вас есть только один, то вы также можете просто использовать первый.Я также рекомендую вам удалить пустой конструктор, чтобы убедиться, что он не будет использоваться случайно:

public DB(DbContextOptions<DB> options)
    : base(options)
{ }
0 голосов
/ 24 сентября 2018

Ваш конструктор, принимающий DbContextOptions, неверен.Вам нужен тот, который принимает один для вашего конкретного DbContext.Поэтому вместо:

public DB(DbContextOptions<DbContext> options) : base(options) { }

Использование:

public DB(DbContextOptions<DB> options) : base(options) { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...