13

I wydają się być coraz ten komunikat o błędzie podczas korzystania z Entity Framework 7 i MVC6Brak dostawców baz danych są konfigurowane EF7

System.InvalidOperationException Brak dostawców baz danych są skonfigurowane. Skonfiguruj dostawcę bazy danych, zastępując opcję OnConfiguring w klasie DbContext lub AddDbContext podczas konfigurowania usług .

Wierzę, że zrobiłem wszystko, co powinienem robić, więc może to jest błąd. Używam wersji 7.0.0-beta7 Entity Framework.

Mam skonfigurować mój DbContext, interfejs, dzięki któremu mogę sfałszować DbContext (był potrzebny w EntityFramework 6 do testowania jednostkowego). Moje usługi wziąć interfejs jako konstruktor i mam konfiguracji DI w MVC 6.

W moim Startup.cs złożyć Mam następujący

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>(); 
} 

Sprawdziłem moje connectionString i że wraca prawidłowe połączenie . Sprawdziłem także w mojej usłudze, że obiekt jest wstrzykiwany, i nie jest zerowy, więc wszystko powinno działać.

Mój plik config.json wygląda to

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

My DbContext nie zastąpić metodę OnConfiguring, ponieważ uważam, że nie jest potrzebne, gdyż robię to wszystko jak wyżej? Czy mam rację? Czego mi brakuje? Patrzyłem na wiele różnych stron internetowych, myślę, że niektóre używają starego kodu, ponieważ niektóre metody nie istnieją, a inne strony mają to samo co ja.

+0

Jak się tworzenie 'MyDbContext' w kodzie? – DavidG

Odpowiedz

26

Skonfiguruj swój MyDbContext pokazany poniżej, aby wprowadzić parametr opcji zdefiniowany w wywołaniu Startup.cs AddDbContext().

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

To pozwoli Ci zdać ciąg połączenia z konfiguracji (config.json) do options.UseSqlServer metoda call()

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

spotkałem ten sam problem, kiedy musiałem podzielić moje rozwiązanie do oddzielnych projektów Web, BL i DAL.

+0

Idealny! Dziękujemy – Gillardo

+0

Jeśli chcesz sfałszować DbContext, nie potrzebujesz interfejsu.Po prostu ustaw wirtualny DbSet , aby można było z nich kpić. Zakładam, że nie chcesz kpić z kontekstu. Bazy danych lub kontekstu. Konfiguracja i testowanie struktury encji ;-) – Pascal

+0

W jaki sposób utworzysz MyDbContext w kontrolerze lub gdziekolwiek będziesz go używał? –

4

Wierzę, że trafisz ten błąd na linii, gdzie próbuje uzyskać dostęp do niektórych danych z bazy danych. Możesz rozwiązać ten problem, konfrontując swój kontekst. Wystarczy zastąpić metodę 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) 
    { 
     ... 
    } 
} 
1

Spróbuj wykonać następujące czynności:

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"]); 
    } 
} 
Powiązane problemy