7

Mój problem polega na tym, że poniższy kod nie rejestruje magazynu danych podczas uruchamiania. Jest to swoisty „error” oświadczenie dostaję w odpowiedzi z aplikacji:Dodawanie DbContextOptions w Startup.cs nie rejestrowanie magazynu danych

An unhandled exception occurred while processing the request. 

InvalidOperationException: No data stores are configured. Configure a data store by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services. 
    Microsoft.Data.Entity.Storage.DataStoreSelector.SelectDataStore(ServiceProviderSource providerSource) 

W ConfigureServices (usług IServiceCollection) Próbuję określić DbContextOptions dla mojego DbContext w lambda. Kod:

services.AddEntityFramework(Configuration) 
    .AddSqlServer() 
    .AddDbContext<MyDbContext>(
     options => 
     options.UseSqlServer(Configuration.Get("Data:DefaultConnection:ConnectionString")) 
    ); 

W moim DbContext Mam konstruktora, który wysyła opcję bazy, kod:

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

Mój plik konfiguracyjny config.json, który jest odczytywany przy starcie, zawiera ten ConnectionString:

"Data": { 
    "DefaultConnection": { 
     "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=MyDbName;Trusted_Connection=True;MultipleActiveResultSets=True;" 
    } 
} 

już wcześniej stosowany

protected override void OnConfiguring(DbContextOptions options) 
{ 
    options.UseSqlServer(Startup.Configuration.Get("Data:DefaultConnection:ConnectionString")); 

} 

w moim DbContext powodzeniem. Rejestruje on magazyn danych i działa poprawnie, ale wolałbym korzystać z metody lambda.

Jeśli jest więcej informacji, dostarczę go.

+0

Tak, wydaje się, że droga Lambda nie działa prawidłowo w wersji beta 4, mam ten sam problem, gdy próbuje wykonać migracje –

+0

@RonDeFreitas Tak, jestem na beta3 w tej chwili, ale myślę, wystarczy poczekać, aż go naprawią, po prostu pomyślałem, że to dziwne, że EF 7 na github ma lambdę jako przykład ustawienia DbContextOptions. Dzięki, dobrze wiedzieć, że nie jestem sam w tej sprawie. – DanielRJ

Odpowiedz

5

Czy wstrzykujesz swój kontekst do kontrolera lub gdziekolwiek go używasz? Odkryłem, że jeśli spróbujesz otworzyć kontekst zamiast go wstrzykiwać, to nie używa on konfiguracji określonej w Startup.cs

+0

Wstrzykuję mój DbContext. Więc nie jest tak smutno. – DanielRJ

+0

Weird ... to mój kontekst na beta4 i to działa dobrze services.AddEntityFramework() .AddSqlServer() .AddDbContext (options => options.UseSqlServer (Configuration [ "Dane: DefaultConnection: ConnectionString" ])); – Slick86

+0

Dzięki za podzielenie się, jutro spróbuję. Mam zamiar przejść na wersję beta4, jeśli nie będzie to uciążliwe. Rozpoczęło się od wersji beta2, a aktualizacja była bolesna między 2 a 3. Migracje i zmiana nazwy klasy w Microsoft.MVC, a nie zabawa. Dam ci znać, jak poszło jutro. – DanielRJ

1

Mam (wciąż) ten sam problem z EF7 i beta 4. Jest to moje obejście problemu mój kontekst danych:

public class AspNetDataContext : IdentityDbContext, IDataContext 
{ 
    private readonly string _connectionString; 
    public DbSet<Player> Players { get; set; } 

    public AspNetDataContext(DbContextOptions options) 
    { 
     _connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString; 
    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlServer(_connectionString); 
    } 
} 

wyodrębnić ConnectionString z opcji i to wykorzystać w sposobie OnConfiguring. Nadal nie jest to rozwiązanie, które chcemy, ale nie muszę zmieniać czegoś w pliku Startup.cs (wszystko, co jest opisane powyżej). I jak tylko to się naprawi, po prostu musisz usunąć te rzeczy z klasy kontekstu danych. A może ktoś ma inne (a nawet lepsze) rozwiązanie tego problemu.

+0

A co z beta5? –

-1

EF7 ma nowe sytax od DBContextOptionsBuilder do EntityOptionsBuilder. Poniżej jest gotowy do użycia także dla rusztowania z linii poleceń.

public class ContentContext : DbContext 
{ 
    public DbSet<Content> Contents { get; set; } 
    public DbSet<ContentCategory> ContentCategories { get; set; } 

    protected override void OnConfiguring(EntityOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlServer("Data:DefaultConnection:ConnectionString"); 
    } 
} 
Powiązane problemy