Nach dem Upgrade auf ASP.NET Core 2.0 kann ich anscheinend keine Migrationen mehr erstellen.
Ich erhalte
"Beim Aufrufen der Methode 'BuildWebHost' für die Klasse 'Program' ist ein Fehler aufgetreten. Fortsetzung ohne den Anwendungsdienstanbieter. Fehler: Ein oder mehrere Fehler sind aufgetreten. (Die vom Anmelden angeforderte Datenbank" ... "kann nicht geöffnet werden. Die Anmeldung ist fehlgeschlagen. Anmeldung fehlgeschlagen für Benutzer '...' "
und
"Ein Objekt vom Typ 'MyContext' kann nicht erstellt werden. Fügen Sie dem Projekt eine Implementierung von 'IDesignTimeDbContextFactory' hinzu, oder lesen Sie https://go.microsoft.com/fwlink/?linkid=851728, um weitere Muster zu erhalten, die zur Entwurfszeit unterstützt werden."
Der Befehl, den ich zuvor ausgeführt habe, war $ dotnet ef migrations add InitialCreate --startup-project "..\Web"
(aus dem Projekt / Ordner mit dem DBContext).
Verbindungszeichenfolge: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"
Das ist mein Program.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Antworten:
Sie können eine Klasse hinzufügen, die IDesignTimeDbContextFactory in Ihrem Webprojekt implementiert.
Hier ist der Beispielcode:
Navigieren Sie dann zu Ihrem Datenbankprojekt und führen Sie Folgendes über die Befehlszeile aus:
Ressource
quelle
Keine Notwendigkeit für
IDesignTimeDbContextFactory
.Lauf
add-migration initial -verbose
das wird die Details unter enthüllen
Warnung, die die Hauptursache des Problems ist.
In meinem Fall bestand das Problem darin, einen Fehler zu haben
ApplicationRole : IdentityRole<int>
und aufzurufen,services.AddIdentity<ApplicationUser, IdentityRole>()
der den folgenden Fehler verursachtequelle
Lösung 1: (Finden Sie das Problem in 99% der Fälle)
Legen Sie das Webanwendungsprojekt als Startprojekt fest
Führen Sie die folgenden Befehle mit
-verbose
Option aus.Lösung 2:
Umbenennen
BuildWebHost()
inCreateWebHostBuilder()
, daEntity Framework Core tools
erwartet wird, dass eineCreateHostBuilder
Methode gefunden wird, die den Host konfiguriert, ohne die App auszuführen..NET Core 2.2
.NET Core 3.1
Umbenennen
BuildWebHost()
inCreateHostBuilder()
Lösung 3:
Stellen Sie sicher, dass Sie
Dbcontext
zur Abhängigkeitsinjektion hinzugefügt haben :AddDbContext<TContext>
Stellt sowohl Ihren DbContext-TypTContext
als auch den entsprechenden TypDbContextOptions<TContext>
für die Injektion aus dem Service-Container zur Verfügung. Dazu muss IhremDbContext
Typ ein Konstruktorargument hinzugefügt werden , das akzeptiertDbContextOptions<TContext>
.Beispiel: In Startup.cs
AppDbContext- Code:
quelle
public static IWebHostBuilder BuildWebHost(string[] args)
aufpublic static IWebHost BuildWebHost(string[] args)
die.Build()
jetzt in der Funktion enthalteneIDesignTimeDbContextFactory
Einfach umbenennen
BuildWebHost()
inCreateWebHostBuilder()
, da Migrationen diese Methode standardmäßig verwenden.quelle
In meinem Fall war die Ursache des Problems mehrere Startprojekte. Ich habe drei Projekte in meiner Lösung: Mvc, Api und Dal. DbContext und Migrationen im Dal-Projekt.
Ich hatte mehrere Startprojekte konfiguriert. Sowohl Mvc- als auch Api-Projekte wurden ausgeführt, als ich auf Start geklickt habe. Aber in diesem Fall bekam ich diesen Fehler.
Ich konnte die Migration erfolgreich hinzufügen, nachdem ich Mvc als einziges Startprojekt festgelegt und Dal in der Package Manager-Konsole ausgewählt hatte.
quelle
Fügen Sie in der AppContext.cs neben der AppContext-Klasse eine weitere Klasse hinzu:
Dies wird Ihr zweites Problem lösen:
Danach können Sie Initial migration hinzufügen und ausführen, indem Sie den Befehl update-database ausführen . Wenn Sie diese Befehle jedoch ausführen, wenn sich noch keine Datenbank in Ihrem lokalen SQL Server befindet, wird die Warnung wie bei Ihrem ersten Fehler angezeigt: "Ein Fehler
Dies ist jedoch kein Fehler, da eine Migration erstellt wird und ausgeführt werden kann. Ignorieren Sie diesen Fehler also zum ersten Mal, und letzteres wird nicht wieder vorkommen, da Db vorhanden sein wird.
quelle
Bitte überprüfen Sie, ob Sie die Referenz haben
quelle
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
was diese Referenz enthält. Ich habe auch versucht, die oben genannten einzuschließen, aber keine Änderung.Sie können diese Lösung aus dieser Diskussion ausprobieren , die von diesem Beitrag inspiriert wurde .
quelle
Was mir wirklich geholfen hat, war dieser Artikel: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/
Die Grundidee ist, dass bei der Umstellung von .net Core 1 auf 2 die gesamte Datenbankinitialisierung aus der StartUp.cs in die Program.cs verschoben werden sollte. Andernfalls versuchen die EF-Tasks, Ihre DB-Inits auszuführen, wenn Sie Tasks ausführen.
"In den offiziellen Migrationsdokumenten ( https://docs.microsoft.com/en-us/ef/core/miscellaneous/1x-2x-upgrade ) gibt es einen schönen Abschnitt mit dem Titel" Datenbankinitialisierungscode verschieben ", den ich anscheinend habe Ich habe also sichergestellt, dass dies nicht der Grund ist, warum Sie eine Implementierung von IdesignTimeDbContextFactory hinzufügen müssen. "
quelle
Von
https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation
Fügen Sie Factory in .Net Core 2.x hinzu
quelle
Ich hatte dieses Problem und dieses Problem gelöst durch Set -> Web Application (Included Program.cs) Project to -> "Set as Startup Project"
Führen Sie dann -> add-migration initial -verbose aus
in der Package Manager-Konsole
Als Startprojekt festlegen
quelle
Wenn Sie diese IDesignTimeDbContextFactory-Sache vermeiden möchten: Stellen Sie einfach sicher, dass Sie beim Start keine Seed-Methode verwenden. Ich habe bei meinem Start eine statische Seed-Methode verwendet, die diesen Fehler für mich verursacht hat.
quelle
Zuvor haben Sie die Startdaten in der Configure-Methode in Startup.cs konfiguriert. Es wird jetzt empfohlen, die Configure-Methode nur zum Einrichten der Anforderungspipeline zu verwenden. Der Anwendungsstartcode gehört zur Main-Methode.
Die überarbeitete Hauptmethode. Fügen Sie der Program.cs die folgenden Verweise hinzu:
using Microsoft.Extensions.DependencyInjection;
using MyProject.MyDbContextFolder;
quelle
Es gibt ein Problem mit dem Seeding von DB aus Startup.Configure in 2.0 ... Sie können es trotzdem mit dieser Problemumgehung tun. Getestet und gut funktioniert
https://garywoodfine.com/how-to-seed-your-ef-core-database/
quelle
In meinem Fall trat das Problem auf, weil in meiner Datei Startup.cs eine Methode namens SeedData.EnsurePopulated () aufgerufen wurde .
Die Arbeit der SeedData- Klasse besteht darin, der Datenbanktabelle Anfangsdaten hinzuzufügen. Der Code lautet:
LÖSUNG
Kommentieren Sie vor der Migration einfach den Aufruf der SeedData- Klasse in der Datei Startup.cs aus.
Das hat mein Problem gelöst und ich hoffe, Ihr Problem wird auch auf die gleiche Weise gelöst.
quelle
Ich bin auf dasselbe Problem gestoßen. Ich habe zwei Projekte in der Lösung. welche
Ursprünglich wurde das API-Projekt als Startprojekt festgelegt.
Ich habe das Startup-Projekt in das Projekt geändert, das Kontextklassen enthält. Wenn Sie Visual Studio verwenden , können Sie ein Projekt als Startprojekt festlegen, indem Sie:
quelle
Stellen Sie zunächst sicher, dass Sie Ihre Datenbank in konfiguriert haben.
Startup.cs
In meinem Fall wurde dieser Fehler angezeigt, da ich das Folgende in nicht angegeben habeStartup.cs
quelle
Verwenden von ASP.NET Core 3.1 und EntityFrameWorkCore 3.1.0. Überschreiben der OnConfiguring der Kontextklasse nur mit einem parameterlosen Konstruktor
quelle
Ich war mit dem Fehler konfrontiert
"Ein Objekt vom Typ 'MyContext' kann nicht erstellt werden. Fügen Sie dem Projekt eine Implementierung von 'IDesignTimeDbContextFactory' hinzu, oder lesen Sie https://go.microsoft.com/fwlink/?linkid=851728, um weitere Muster zu erhalten, die zur Entwurfszeit unterstützt werden."
So wurde mein Problem gelöst. Führen Sie den folgenden Befehl aus, während Sie sich in Ihrem Lösungsverzeichnis befinden
Hier ist Application mein Startprojekt mit der Klasse Startup.cs und Infrastructure ist mein Projekt mit der Klasse DbContext.
Führen Sie dann das Update mit derselben Struktur aus.
quelle
Ich habe das gleiche Problem, da ich auf Microsoft.EntityFrameworkCore.Tools.DotNet verwiesen habe
Nach dem Upgrade auf die neuere Version wurde es behoben
quelle
In der Datei appsettings.json des Hauptprojekts hatte ich "In Ausgabeverzeichnis kopieren" auf "Immer kopieren" gesetzt und es funktionierte.
quelle
Beispiel für eine DB-Kontextklasse für .net-Kernkonsolenanwendungen
quelle
Sie können auch im Konstruktor der Startklasse verwenden, um der Konfiguration eine JSON-Datei (in der sich die Verbindungszeichenfolge befindet) hinzuzufügen. Beispiel:
quelle
Für mich war es, weil ich das
Output Type
von meinem Startup-Projekt vonConsole Application
auf geändert habeClass Library
.Zurückkehren
Console Application
hat den Trick getan.quelle
Ich hatte dieses Problem in einer Lösung, die hat:
Ich erhalte die Meldung "Objekt kann nicht erstellt werden ...", wenn das Blazor-Projekt als Startprojekt festgelegt ist, nicht jedoch, wenn das MVC-Projekt als Startprojekt festgelegt ist.
Das ist mir ein Rätsel, denn in der Package Manager-Konsole (in der ich die Migration erstelle) habe ich das Standardprojekt auf eine C # -Klassenbibliothek festgelegt, die tatsächlich den DB-Kontext enthält, und ich gebe auch den DB-Kontext in an Mein Aufruf zur Add-Migration
add-migration MigrationName -context ContextName
, daher scheint es seltsam, dass Visual Studio sich darum kümmert, welches Startprojekt derzeit festgelegt ist.Ich vermute, der Grund dafür ist, dass die PMC, wenn das Blazor-Projekt das Startprojekt ist, die Version von .NET als Core 3.0 aus dem Startprojekt ermittelt und dann versucht, diese zu verwenden, um die Migrationen in der .NET Standard 2.0-Klasse auszuführen Bibliothek und einen Konflikt irgendeiner Art zu treffen.
Unabhängig von der Ursache wurde das Problem behoben, indem das Startprojekt in das MVC-Projekt geändert wurde, das auf Core 2.2 und nicht auf das Blazor-Projekt abzielt
quelle
Für mich war das Problem, dass ich die Migrationsbefehle im falschen Projekt ausführte. Durch Ausführen der Befehle innerhalb des Projekts, das die Datei Startup.cs enthielt, und nicht des Projekts, das den DbContext enthielt, konnte ich dieses spezielle Problem überwinden.
quelle
In meinem Fall hilft es, das StartUp-Projekt in init einzustellen. Sie können dies durch Ausführen tun
quelle
Ich hatte das gleiche Problem. Ich habe gerade die ap.jason in application.jason geändert und das Problem behoben
quelle