Подтвердить что ты не робот

Нет поставщиков баз данных EF7

Кажется, я получаю это сообщение об ошибке при использовании Entity Framework 7 и MVC6

System.InvalidOperationException Не настроены поставщики баз данных. Настройте поставщика базы данных, переопределив OnConfiguring в своем DbContext или в методе AddDbContext при настройке услуги.

Я считаю, что сделал все, что я должен делать, поэтому, возможно, это ошибка. Я использую версию 7.0.0-бета7 Entity Framework.

Я установил свой DbContext, интерфейс, чтобы я мог издеваться над DbContext (был необходим в EntityFramework 6 для модульного тестирования). Мои службы принимают интерфейс как конструктор, и у меня есть установка DI в MVC 6.

В моем файле Startup.cs у меня есть

public void ConfigureServices(IServiceCollection services)
{
    // entity framework
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<MyDbContext>(options =>
            options.UseSqlServer(Configuration["Data:MyConnection:ConnectionString"])
        );

    // Add MVC services to the services container.
    services.AddMvc();

    // new context on each request
    services.AddScoped<IMyDbContext, MyDbContext>();
}

Я проверил connectionString и вернул действительное соединение. Я также проверил в своей службе, что объект вводится, и он не является нулевым, поэтому все должно работать.

Мой файл config.json выглядит следующим образом

{
    "Data": {
        "MyConnection": {
            "ConnectionString": "Server=(local);Database=XXXX;Trusted_Connection=True;"
        }
    }
}

My DbContext не переопределяет метод OnConfiguring, потому что я считаю, что это не нужно, поскольку я делаю все это, как указано выше? Я прав? Что мне не хватает? Посмотрев на множество разных сайтов, я думаю, что некоторые используют старый код, потому что некоторые методы не существуют, а другие веб-сайты имеют то же самое, что и у меня.

4b9b3361

Ответ 1

Настройте свой MyDbContext, показанный ниже, чтобы ввести параметр, определенный в вызове Startup.cs AddDbContext().

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

Это позволит вам передать строку подключения из Configuration (config.json) в опции вызова метода. UseSqlServer()

services.AddEntityFramework()
    .AddSqlServer()
    .AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration["Data:MyConnection:ConnectionString"]));

Я столкнулся с той же проблемой, когда мне пришлось разделить мое решение на отдельные проекты Web, BL и DAL.

Ответ 2

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

public class MyDbContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer("<your connection string>");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        ...
    }
}

Ответ 4

Попробуйте следующее:

public class DataContext<TEntity> : DbContext where TEntity : class
{

    private TEntity _entity = null;
    public DataContext()
        : base()
    {

    }
    public DataContext(TEntity entity)
    {
        this._entity = entity;
    }
    public DbSet<TEntity> Entity { get; set; }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.HasDefaultSchema("dbo");

    }

    public IConfigurationRoot Configuration { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var configuration = new ConfigurationBuilder()
              .AddJsonFile("appsettings.json");
        Configuration = configuration.Build();
        optionsBuilder.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);
    }
}