2017-08-25 74 views
5

Ben DBContext (böylece onunla başlangıçta bazı ek iş yapabilir) bir örneğini almak için çalışıyorum, ben de bir örneğini almaya çalışırken aşağıdaki hatayı alıyorum Yapılandırma yöntemi:ASP.NET Core 2 + db bağlamın örneğini alın

iletisi: MyApp.Data.MyDbContext 'kapsamlı hizmet çözülemiyor '' kök sağlayıcısından.'

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

ben denetleyicisi aracılığıyla DBContext ince bir örneğini erişebilir, vb

+1

Yapılandırma yöntemine bağımlılıklar ekleyebilir ve bunlar otomatik olarak çözülür. Herkese açık void yapılandırmasını imzalamayı deneyin. Configure (IApplicationBuilder uygulaması, IHostingEnvironment env, MyDbContext dbContext) –

cevap

7

Paul Hiles comment doğrudur ama bu yöntem .NET Çekirdek 1.0'da daha iyi çalışır.

ASP.NET Çekirdek 2.0 genellikle Startup.cs herhangi bir veritabanı kurulumu çalıştırmak için kötü bir fikirdir. Eğer CLI veya Visual Studio herhangi taşıma işlemlerini eğer Startup.cs tüm çalıştırın ve başarısız olur yapılandırmanızı çalıştırmayı dener olmasıdır. Tabii ki, Entity-Framework'ü kullanmıyorsanız, bu bir problem değildir, ancak hala 2.0'da yapılması önerilen yol değildir. Şimdi Program.cs'da yapılması önerilir.

Örneğin size gereken herhangi bir kurulum çalışacaktır IWebHost bir uzantısı yöntemi oluşturabilirsiniz.

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

Sonra Program.cs yılında sonra çalıştırmadan önce bu yöntemi çağırabilirsiniz.

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