InvalidOperationException: для этого DbContext не настроен поставщик базы данных.Поставщик может быть настроен путем переопределения DbContext - PullRequest
0 голосов
/ 28 февраля 2019

Я работаю над проектом без шаблона хранилища.Я пытаюсь отделить свою бизнес-логику от контроллеров, что-то вроде создания бизнес-уровня.Я делаю следующее, чтобы получить всех моих пользователей.

DbContext

public class DatabaseContext : DbContext
{
    public DatabaseContext() : base() { }
    public DatabaseContext(DbContextOptions options) : base(options) { }
    public DbSet<User> Users { get; set; }
    public DbSet<OvertimeRequest> OvertimeRequests { get; set; }
    public DbSet<HolidayRequest> HolidayRequests { get; set; }
    public DbSet<PaymentRequest> PaymentRequests { get; set; }
}

OvertimeRequestBusiness

public class OvertimeRequestBusiness
{
    public static OvertimeRequestBusiness Instance { get; } = new 
        OvertimeRequestBusiness();

    public OvertimeRequestBusiness() { }

    public async Task<List<User>> GetAllUsersAsync()
    {
        using (var ctx = new DatabaseContext())
        {
            var query = ctx.Users;
            var res = await query.ToListAsync();
            return res;
        }
    }
}

Контроллер

[Route("users"), HttpGet]
public async Task<List<User>> GetAllUsers()
{
    return await OvertimeRequestBusiness.Instance.GetAllUsersAsync();
}

И ошибкаЯ получаю

InvalidOperationException: для этого DbContext не настроен поставщик базы данных.Поставщик может быть настроен путем переопределения метода DbContext.OnConfiguring или с помощью AddDbContext в поставщике службы приложений.Если используется AddDbContext, то также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его базовому конструктору для DbContext **

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Без изменения OvertimeRequestBusiness необходимо установить строку подключения в БД в OnCongfiguring методе DbContext class:

  1. Установка строки подключения в `appsettings.json:

    "ConnectionStrings": {
        "MyConnectionString": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-1234;Trusted_Connection=True;MultipleActiveResultSets=true"
    },
    
  2. Создать Setting.cs:

    public class Setting
    {
        public static string ConnectionString { get; set; }
    }
    
  3. Конфигурировать строку подключения в Startup.cs:

    Setting.ConnectionString = Configuration.GetSection("ConnectionStrings:MyConnectionString").Value;
    
  4. Изменить DatabaseContext:

    public class DatabaseContext : DbContext
    {
    
          public DbSet<User> Users { get; set; }
          public DbSet<OvertimeRequest> OvertimeRequests { get; set; }
          public DbSet<HolidayRequest> HolidayRequests { get; set; }
          public DbSet<PaymentRequest> PaymentRequests { get; set; }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer(Setting.ConnectionString);
            }
        }
    
    }
    

Но наиболее распространенным способом является использование DbContext с внедрением зависимости:

https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

0 голосов
/ 01 марта 2019

Я удалил конструктор по умолчанию без параметров DbContext, а затем передал DbContextBuilderOption в качестве параметра в OvertimeRequestBusiness.Это помогло мне.

OvertimeRequestBusiness Теперь выглядит так

 public class OvertimeRequestBusiness
    {
        public static OvertimeRequestBusiness Instance { get; } = new OvertimeRequestBusiness();

        DbContextOptionsBuilder<DatabaseContext> _optionsBuilder;


        public OvertimeRequestBusiness() {
            var optionsBuilder = new DbContextOptionsBuilder<DatabaseContext>();
            optionsBuilder.UseSqlServer(@"ConnectionString");
            _optionsBuilder = optionsBuilder;
        }
  public async Task<List<User>> GetAllUsersAsync()
        {
            using (var ctx = new DatabaseContext(_optionsBuilder.Options))
            {
                var query = ctx.Users;
                var res = await query.ToListAsync();
                return res;
            }
        }

    }
0 голосов
/ 28 февраля 2019

Ваш DatabaseContext конструктор должен указывать на строку подключения.

Измените ее на

public class DatabaseContext : DbContext
{
    // Tell DbContext to look for the "MyConnectionString" in .config.
    public DatabaseContext() : base("MyConnectionString") { }

    public DatabaseContext(DbContextOptions options) : base(options) { }

    public DbSet<User> Users { get; set; }
    public DbSet<OvertimeRequest> OvertimeRequests { get; set; }
    public DbSet<HolidayRequest> HolidayRequests { get; set; }
    public DbSet<PaymentRequest> PaymentRequests { get; set; }
}

Где ваша строка подключения находится в web.config

<configuration>
    <connectionStrings>
        <add name="MyConnectionString" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Initial Catalog=ABC;Integrated Security=True;MultipleActiveResultSets=true"></add>
    </connectionStrings>
</configuration>
...