2017-08-25 3 views
5

Ich versuche, eine Instanz des DbContext zu bekommen (so kann ich einige zusätzliche Arbeit beim Start damit), bekomme ich den folgenden Fehler beim Versuch, eine Instanz zu bekommen Die Configure-Methode:ASP.NET Core 2 + Get Instanz von db Kontext

System.InvalidOperationException: 'Bereichsbasierter Dienst' MyApp.Data.MyDbContext 'vom Stammanbieter kann nicht aufgelöst werden.'

public void ConfigureServices(IServiceCollection services) 
{ 
services.AddDbContext<MyDbContext>(
       options => options.UseSqlServer(Configuration.GetConnectionString("MyDbContext"))); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{ 

    var dbContext = app.ApplicationServices.GetService(typeof(MyDbContext)) as MyDbContext; 
} 

ich eine Instanz der DbContext fein über den Controller zugreifen kann, etc

+1

Sie können der Configure-Methode Abhängigkeiten hinzufügen, die automatisch aufgelöst werden. Versuchen Sie, die Signatur in "public void" zu ändern Konfigurieren Sie (IApplicationBuilder-App, IHostingEnvironment-env, MyDbContext-dbContext). –

Antwort

7

Paul Hiles Kommentar ist richtig, aber diese Methode funktioniert besser in .NET-Core 1.0.

In ASP.NET Core 2.0 ist es in der Regel eine schlechte Idee, eine Datenbankkonfiguration in Startup.cs auszuführen. Dies liegt daran, dass bei Ausführung von Migrationen über die CLI oder Visual Studio die gesamte Version Startup.cs ausgeführt wird und Sie versuchen, die Konfiguration auszuführen, die fehlschlägt. Wenn Sie kein Entity-Framework verwenden, ist dies natürlich kein Problem, aber es ist immer noch nicht die empfohlene Vorgehensweise in 2.0. Es wird jetzt empfohlen, es in Program.cs zu tun.

Zum Beispiel können Sie eine Erweiterungsmethode von IWebHost erstellen, die jedes Setup ausführen wird, das Sie benötigen.

public static IWebHost MigrateDatabase(this IWebHost webHost) 
{ 
    var serviceScopeFactory = (IServiceScopeFactory)webHost.Services.GetService(typeof(IServiceScopeFactory)); 

    using (var scope = serviceScopeFactory.CreateScope()) 
    { 
     var services = scope.ServiceProvider; 
     var dbContext = services.GetRequiredService<YourDbContext>(); 

     dbContext.Database.Migrate(); 
    } 

    return webHost; 
} 

Und dann in Program.cs können Sie dann diese Methode aufrufen, bevor ausgeführt wird.

public static void Main(string[] args) 
{ 
    BuildWebHost(args) 
     .MigrateDatabase() 
     .Run(); 
}