2017-08-25 37 views
5

Tôi đang cố gắng để có được một thể hiện của DbContext (vì vậy tôi có thể làm một số công việc bổ sung khi khởi động với nó), tôi nhận được lỗi sau khi cố gắng để có được một thể hiện trong phương thức Định cấu hình:ASP.NET Core 2 + Lấy trường hợp của bối cảnh db

System.InvalidOperationException: 'Không thể giải quyết dịch vụ phạm vi' MyApp.Data.MyDbContext 'từ nhà cung cấp gốc'.

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

tôi có thể truy cập vào một thể hiện của các mỹ DbContext qua bộ điều khiển, vv

+1

Bạn có thể thêm phụ thuộc vào phương pháp Định cấu hình và chúng sẽ tự động được giải quyết. Thử thay đổi chữ ký thành void công khai Cấu hình (ứng dụng IApplicationBuilder, IHostingEnvironment env, MyDbContext dbContext) –

Trả lời

7

Paul Hiles bình luận là đúng nhưng phương pháp mà làm việc tốt hơn trong .NET Lõi 1.0.

Trong ASP.NET Core 2.0, thường là một ý tưởng tồi khi chạy bất kỳ thiết lập cơ sở dữ liệu nào trong Startup.cs. Điều này là bởi vì nếu bạn chạy bất kỳ di chuyển từ CLI hoặc Visual Studio nó sẽ chạy tất cả các Startup.cs và cố gắng chạy cấu hình của bạn mà sẽ thất bại. Tất nhiên nếu bạn không sử dụng Entity-Framework thì đây không phải là một vấn đề tuy nhiên nó vẫn không phải là cách được khuyến khích để thực hiện nó trong 2.0. Bây giờ bạn nên làm điều đó trong Program.cs.

Ví dụ: bạn có thể tạo phương thức tiện ích IWebHost để chạy bất kỳ thiết lập nào bạn cần.

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

Sau đó, tại Program.cs, bạn có thể gọi phương thức đó trước khi chạy.

public static void Main(string[] args) 
{ 
    BuildWebHost(args) 
     .MigrateDatabase() 
     .Run(); 
} 
Các vấn đề liên quan