2015-11-22 2 views
9

Ich bin neu in EF7. Ich weiß, das ist eine doppelte Frage:Entity Framework 7 kein Datenbankprovider konfiguriert => wenn Migrationen in ein anderes Projekt verschoben werden

No database providers are configured EF7

Aber warten, bevor Sie diese Frage haben wollen geschlossen ... und lesen Sie weiter

services.AddEntityFramework() 
     .AddSqlServer() 
     .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); 

services.AddIdentity<ApplicationUser, IdentityRole>() 
     .AddEntityFrameworkStores<ApplicationDbContext>() 
     .AddDefaultTokenProviders(); 

    services.AddScoped<TestRepository, TestRepository>(); 

Jetzt habe ich die dnx ef Datenbank-Update-Befehl ausführen auf dem cmd Fenster in meinem EF Projekt und diese Fehlermeldung erhalten:

C:\TGB.DataAccess>dnx ef database update 
System.InvalidOperationException: No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services. 
    bei Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource) 
    bei Microsoft.Data.Entity.Internal.DbContextServices.<>c__DisplayClass6_0.<Initialize>b__0() 
    bei Microsoft.Data.Entity.Internal.LazyRef`1.get_Value() 
    bei Microsoft.Data.Entity.Internal.DbContextServices.get_DatabaseProviderServices() 
    bei Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c.<AddEntityFramework>b__0_8(IServiceProvider p) 
    bei Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider provider) 
    bei Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider) 
    bei Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass12_0.<RealizeService>b__0(ServiceProvider provider) 
    bei Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) 
    bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) 
    bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService[T](IServiceProvider provider) 
    bei Microsoft.Data.Entity.Design.Internal.DesignTimeServicesBuilder.Build(DbContext context) 
    bei Microsoft.Data.Entity.Design.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType) 
    bei Microsoft.Data.Entity.Commands.Program.Executor.<>c__DisplayClass7_0.<UpdateDatabase>b__0() 
    bei Microsoft.Data.Entity.Commands.Program.Executor.Execute(Action action) 
No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services. 

Jetzt habe ich versucht, den Konstruktor meines ApplicationDbContext nach t zu ändern o die Lösung Link, den ich an der Spitze eingefügt:

Das ist mein Code:

Mein ApplicationDbContext.cs ist eigentlich leer, das bedeutet nichts, was ich außer Kraft gesetzt haben.

Mit Blick auf die Basisklasse der Basisklasse gibt es den überladenen Konstruktor mit Parameter DbContextOptions, aber ich kann nichts von meinem Konstruktor übergeben ?!

// 
     // Summary: 
     //  Initializes a new instance of Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext. 
     // 
     // Parameters: 
     // options: 
     //  The options to be used by a Microsoft.Data.Entity.DbContext. 
     public IdentityDbContext(DbContextOptions options); 

Was ist auf meiner Seite gebrochen? Ich verwende EF 7 RC1 und DNX 451.

Dies geschieht nur, wenn Sie den ApplicationDbContext/ApplicationUser und den gesamten Migrationsordner in ein zusätzliches Projekt namens "DataAccess" verschieben. Dann scheint alles kaputt zu sein.

+0

Haben Sie versucht, den Kontext anzugeben, zB 'dnx database update -c ApplicationDbContext'? – DavidG

+0

Sie können auch das Projekt angeben '-p ' – DavidG

+0

Ich bin direkt im DataAccess-Projekt über CMD und ich führe dnx ef Datenbankaktualisierung -c ApplicationDbContext => Der gleiche Fehler wie zuvor! – Pascal

Antwort

5
  1. Erstellen Sie eine neue Anwendung von ASP.NET-Namen "WebProject" Application Template mit dem Web (Authentication: Individuelle Benutzerkonto).

  2. nun ein weiteres Projekt zur Lösung hinzufügen namens „Data Access“ (sagen wir mal Klassenbibliothek Typ obwohl seine nicht relevant)

  3. Jetzt ApplicationDbContext/ApplicationUser Dateien & Migrationen Ordner Data Access Projekt verschieben.

  4. In diesem Stadium wird die Erstellung fehlschlagen, daher müssen wir die project.json für korrekte Referenzen korrigieren.

  5. Für Data Access-Projekt, fügen Sie folgende Abhängigkeiten

    "dependencies": { 
        "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final", 
        "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final" 
    } 
    
  6. Für WebProject, fügen DataAccess als Abhängigkeit. Da DataAccess auf 2 Pakete verweist, können Sie diese Referenzen aus WebProject entfernen.
    Build sollte jetzt erfolgreich sein und Sie können Web-Anwendung starten.

Wie ef Migrationen verwenden:

In Kommandozeile, gehen Sie in das Verzeichnis von WebProject (und nicht die Data Access-Projekt). Alle ef-Befehle funktionieren von hier aus.

Um neue Migrationen zum Migrationsordner des DataAccess-Projekts hinzuzufügen, müssen Sie das Flag -p verwenden. Wie,
dnx ef migrations add Sample -p DataAccess.

Das Problem tritt auf, weil die Befehle von Cmd in DataAccess-Projekt ausgeführt werden. Ihre Startup-Klasse, die alle Dienste initialisiert, befindet sich in WebProject. Wenn Sie versuchen, Befehle aus dem DataAccess-Verzeichnis auszuführen, wird dnx ef erkannt, da auf EntityFramework.Commands verwiesen wird. Wenn Sie jedoch versuchen, die Migrationen zu verwenden, werden Dienste nicht initialisiert. Daher wird das Überschreiben der Ausnahme fehlschlagen.

+0

Danke, dass es funktioniert! Tut mir leid, dass ich so spät ... – Pascal

5

Versuchen Sie, Ihre Context-Klasse in Ihr "DataAccess" -Projekt zu verschieben und die OnConfiguring-Methode Ihres Kontexts in Ihrem "DataAccess" -Projekt zu überschreiben, und führen Sie dann die Migration aus.

public partial class MyContext : DbContext 
{ 
    protected override void OnConfiguring(DbContextOptionsBuilder options) 
    { 
     options.UseSqlServer(@"Server=****;Database=***;user id=***;password=***"); 
    } 
} 

Oder Sie können wie folgt tun, wenn Sie Ihre Verbindungszeichenfolge nicht hart codieren möchten. DI wird die Optionen für Sie eingeben;

public partial class MyContext : DbContext 
{ 
    public MyContext(DbContextOptions<MyContext> options) : base(options) 
    { 

    } 
} 

und auf Ihrem Startup.cs;

public Startup(IHostingEnvironment env) 
{ 
    var builder = new ConfigurationBuilder() 
     .AddJsonFile("appsettings.json") 
} 

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddEntityFramework() 
     .AddSqlServer()    
     .AddDbContext<WtContext>(options => 
      options.UseSqlServer(Configuration["Data:MyDb:ConnectionString"])); 
} 

und Ihre appsetting.json;

{ 
    "Data": { 
    "MyDb": { 
     "ConnectionString": "**********" 
    } 
    } 
} 
+1

Diese öffentlichen MyContext (DbContextOptions Optionen): Basis (Optionen) ist nicht möglich in meinem Code, weil MyContext KEIN Konstruktor mit jedem Parameter hat. Ja ich erben von DbContext! – Pascal

+0

Wie instanziieren Sie MyContext() im Controller oder wo immer Sie es brauchen? –

Verwandte Themen