2017-09-05 89 views
9

Öncelikle veritabanımı örnek verilerle doldurmaya çalışıyorum. Ben varsayılan seçenekleri ile ASP.NET Core'u 2.0 kullanıyorumASP.NET Çekirdek 2.0'de DbContext çözümlenemiyor

(ASP.NET Core RC2 Seed Database bakınız) bu (yılında Startup.Configure) bunu yapmanın yolu olduğunu okudum.

Her zamanki gibi, DbContext numaramı ConfigureServices'a kaydediyorum. Ama bundan sonra Startup.Configure yönteminde, ben denemek ne zaman GetRequiredService kullanarak çözmek için, bu mesajla atar:

iletisi: SGDTP.Infrastructure.Context 'hizmetini kapsamlı çözemezse'. SGDTPContext 'kökünden sağlayıcısı.' Böyle

Benim Başlangıç ​​sınıfı: Neyi yanlış yapıyorum

public abstract class Startup 
{ 
    public Startup(IConfiguration configuration) 
    { 
     Configuration = configuration; 
    } 

    public IConfiguration Configuration { get; } 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddDbContext<SGDTPContext>(options => options.UseInMemoryDatabase("MyDatabase")) 
     services.AddMvc(); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 
     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
     } 

     app.UseMvc(); 

     SeedDatabase(app); 
    } 

    private static void SeedDatabase(IApplicationBuilder app) 
    { 
     using (var context = app.ApplicationServices.GetRequiredService<SGDTPContext>()) 
     { 
      // Seed the Database 
      //... 
     } 
    } 
} 

? Ayrıca, bu, tohum verileri oluşturmak için en uygun yer mi?

cevap

11

Kapsamlı bir hizmet olarak SGDTPContext kayıt olursunuz ve o zaman bir alanın dışına erişmeye çalışıyorsunuz.

using (var serviceScope = app.ApplicationServices.CreateScope()) { var context = serviceScope.ServiceProvider.GetService<SGDTPContext>(); // Seed the database. } 

İşte bu yaklaşımı anlatılır o eski Github issue verelim: amaçlar için bir kapsam oluşturmak için, aşağıdaki çözümü kullanabilirsiniz.

Yorumunda, CreateScope uzantı yöntemini işaret ettiği için khellang'a kredi.

Bkz EF Core tohumlama verileri nasıl en iyi yaklaşım olarak bir açıklama @ Tseng 'in yorumları ve answer 2.

+0

Siz adamsınız. Bilgi için büyük, büyük teşekkürler. Bir hayat kurtardın! – SuperJMN

+1

_does, gördüğüm şeyden tohumlamak için önerilen yaklaşım olmaya devam ediyor. Tam olarak değil. Kapsamlı Evet kullanarak, ancak Yapılandırma yöntemini kullanarak, EF Çekirdek 2.0, tasarım zamanında DbContext'in keşfini ve gerçekleştirilmesini yapar. Şu anda önerilen yaklaşım için https://stackoverflow.com/a/45942026/455493 adresine bakın. Eğer 'Configure' yönteminde tohumlama yapmaya devam ederseniz, o zaman 'dotnet ef geçişleri' veya 'dotnet ef veritabanı güncellemesi' çalıştırılıyor, aynı zamanda komut satırı araçlarını çalıştırırken hemen hemen hiç istemediğiniz bir şey olan tohumlama işlemi de yürütülür (sadece – Tseng

+0

Sadece FYI; [IServiceProvider' üzerinde doğrudan bir 'CreateScope' uzantısı yöntemi var] (https://github.com/aspnet/DependencyInjection/blob/88c3bd6fe2786dd759b4a6c6d7c410e895336b6c/src/DI.Abstractions/ServiceProviderServiceExtensions.cs#L120-L128), böylece kesebilirsiniz '.GetRequiredService () 've bunu doğrudan arayın :) – khellang

0

oldu resmi ASP.Net MVC Core'u tutorial izlerken bölümde, bu hatayı almaya nereye uygulamanıza eklenmiş veriler eklemeniz gerekiyor. SeedData sınıfa Uzun lafın kısası, ekleme, bu iki satır

using Microsoft.EntityFrameworkCore; 
using Microsoft.Extensions.DependencyInjection; 

benim için çözüldü:

using Microsoft.EntityFrameworkCore; 
using Microsoft.Extensions.DependencyInjection; 
using System; 
using System.Linq; 

namespace MvcMovie.Models 
{ 
public static class SeedData 
{ 
    public static void Initialize(IServiceProvider serviceProvider) 
    { 
     using (var context = new MvcMovieContext(

      serviceProvider.GetRequiredService<DbContextOptions<MvcMovieContext>>())) 
     { 
      // Look for any movies. 
      if (context.Movie.Any()) 
      { 
       return; // DB has been seeded 
      } 
    ... 

sebebini söyleme, ama bunlar aşağıdaki aldığım seçeneklerden iki idi olamaz Alt + Enter hızlı düzeltme seçeneği.