2016-07-22 12 views
4

Ich versuche, Entity Framework Core in einem Datenrepository zu verwenden, aber ich habe Probleme, EF die Datenbank erstellen zu lassen.Entity Framework Core-Tools beim Erstellen eines Repositorys

In den vorherigen Versionen von EF geschah alles automatisch, EF erstellte die Datenbank, wenn sie beim ersten Mal nicht vorhanden war, als eine Operation an den Daten ausgeführt wurde.

Nun, ich habe in den Dokumenten die Anweisung, EF Migrations zu verwenden. Die Anweisungen sind die Abhängigkeiten und Tools zu installieren:

  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools

Und dotnet ef migrations add MigrationName zusammen laufen mit dotnet ef database update.

Jetzt kommt hier die Sache. Während ich ein Repository erstelle, habe ich ein Projekt AppName.Data, in dem die Repositories implementiert sind, und ein Projekt AppName.WebApi, in dem die Repositories konsumiert werden.

Wenn ich versuche, die Tools hinzuzufügen und dotnet ef von AppName.Data ausführen, funktioniert es nicht, weil AppName.Data eine Bibliothek ist. Die Fehlermeldung besagt, dass das Tool nur im Kontext einer ausführbaren App verwendet werden kann. Der nächste Versuch war dotnet ef von AppName.WebApi, die ausführbar ist. Jetzt dotnet ef funktioniert, aber wenn ich dotnet ef migrations add InitialMigration versuchen, die Datenbank zu erstellen, bekomme ich einen Fehler, weil die DbContext nicht auf dem AppName.WebApi Projekt ist, aber auf einem anderen Projekt.

Ich habe wirklich keine Ahnung, wie das geht. Also, wenn ich möchte, dass EF die Datenbank und all das erstellen, und ich Repositories verwenden möchte, so dass es keinen EF spezifischen Code auf dem ausführbaren Projekt gibt, was soll ich tun?

+0

Zeigen Sie in der Paketmanagerkonsole auf das Projekt, in dem sich der applicationdbcontext befindet, und führen Sie es dann aus. – Thennarasan

Antwort

1

Nach der Suche habe ich auf the docs, auf der "Preview 2 Bekannte Probleme" gefunden, dass dies derzeit eine Einschränkung der Tools ist. Es muss ein ausführbares App-Projekt ausgeführt werden, da es dotnet run verwenden muss.

Die Dokumentation bietet auch Problemumgehungen. Der eine, den ich bevorzugte und der für mich arbeitete, war der erste Workaround. Wir zeigen einfach auf ein ausführbares App-Projekt, das die --startup-project mit dem Pfad des Projekts übergibt.

Statt

laufen
dotnet ef migrations add MigrationName 

Wir betreiben

dotnet ef --startup-project pathToProject migrations add MigrationName 

und alles funktioniert wie erwartet.

0

Alternativ in Ihrem Repository können Sie den folgenden Code in Ihrer DbContext Klasse hinzufügen:

public InviteesDbContext(bool recreate = false) 
    { 
     if (recreate) 
     { 
      recreateDatabase(this); 
     } 
    } 

    private static void recreateDatabase(InviteesDbContext dbContext) 
    { 
     dbContext.Database.EnsureDeleted(); 
     dbContext.Database.EnsureCreated(); 

     setPermissions(dbContext); 
     seed(dbContext); 
    } 

diesen Code zu aktivieren und neu (create) Ihre Datenbank nach Belieben, hinzugefügt in einer Konsole Projekt auf die Lösung, Enthält Ihr Datenrepository-Projekt verwenden Sie diesen Code.

static void Main() 
    { 
     using (InviteesDbContext dbContext = new InviteesDbContext(false)) 
     { 
      Console.WriteLine("Database in existence or created"); 
      Invitee invitee = dbContext.Invitees.Where(i => i.Id == 1).SingleOrDefault(); 
      if (invitee != null) 
      { 
       Console.WriteLine("Invitee " + invitee.Id.ToString() + " found !!"); 
      } 
      Console.ReadKey(); 
     } 

    } 

Wenn Sie vorübergehend Änderung

using (InviteesDbContext dbContext = new InviteesDbContext(true)) 

und die Konsolenanwendung ausgeführt wird die Datenbank neu werden (erstellt).

Warnung: Verwenden Sie diesen Code nur in früheren Phasen Ihres Projekts, wenn sich die Datenbank regelmäßig ändert und der potenzielle Datenverlust nicht so wichtig ist. Verwenden Sie diesen Code niemals in der Produktion.