"Build fehlgeschlagen" in Database First Scaffold-DbContext

81

Ich versuche, Klassen aus einer Datenbank zu generieren (erster Ansatz von EntityFrameworks Datenbank).

Der Einfachheit halber gehe ich mehr oder weniger mit diesem Tutorial mit: https://docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html

Ich bin an einem Punkt angelangt, an dem ich das Äquivalent dieser Codezeile in der Visual Studio Package Manager-Konsole ausführe:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -Verbose

Diese Codezeile generiert den Fehler (bei aktiviertem -Verbose-Modus):

Using startup project 'EFSandbox'.
Using project 'EntityFrameworkCore'
Build started...
Build failed.

Ich sehe keine anderen Optionen, die eine aussagekräftige Ausgabe erzeugen, und ich sehe keine Dokumentation zu diesem bestimmten Fehler. Wenn es überhaupt hilft, verfügt dieses Projekt derzeit nicht über eine Datei project.json. Alles ist in der .csproj-Datei, die ich nicht manuell bearbeitet habe.

LightToTheEnd
quelle
6
Erhalten Sie Fehler / Warnungen, wenn Sie die gesamte Lösung neu kompilieren?
Ignas
@Ignas Hab das gemacht, und ja, ich habe Abhängigkeitsfehler bekommen, die vor dem Neukompilieren nicht existierten und die einfach nicht existieren sollten. Anstatt zu versuchen, dagegen anzukämpfen, habe ich die Lösung neu gemacht. Ich habe jetzt jedoch ein neues Problem. Ich denke, ich sollte nach einer Weile eine neue Frage stellen (wenn diese ähnlich ist), anstatt diese zu bearbeiten.
LightToTheEnd
Denken Sie, Ihr Problem ist, dass Sie eine project.json haben müssen, um die EFC-Tools zu deklarieren. Versuchen Sie, den richtigen Projekttyp neu zu schreiben, da dies zu einem JSON führen kann.
Webezine
1
Für mich war es wichtig, sicherzustellen, dass die gesamte Lösung (nicht nur das Projekt) erfolgreich erstellt wurde, bevor der Gerüstbefehl ausgegeben wurde.
Manish Gupta
Ich wollte diese Frage kurz aktualisieren, da sie viel Aufmerksamkeit auf sich zog - dies war ein viel älterer Build von EF Core als der derzeit verfügbare, und nach mehreren anderen Problemen war die Lösung, die wir letztendlich hatten, EF6, bis Core hatte mehr Zeit, sich niederzulassen. Sogar EF6 warf Probleme auf, aber wir haben es viel zuverlässiger eingerichtet.
LightToTheEnd

Antworten:

152

Zwei wichtige Tipps:

[1] - Stellen Sie sicher, dass Ihr Projekt vollständig erstellt wurde, bevor Sie einen neuen Gerüstbefehl ausführen.

Andernfalls...

  • Sie beginnen mit dem Schreiben einer Codezeile.
  • Sie werden feststellen, dass in Ihrem Modell eine erforderliche DB-Spalte fehlt.
  • Sie werden versuchen, es zu gerüsten.
  • Zwanzig Minuten später werden Sie feststellen, dass Ihr Build (und Ihr Gerüstbefehl) fehlschlägt, weil Sie buchstäblich eine halb geschriebene Codezeile haben. Hoppla!

[2] - In die Quellcodeverwaltung einchecken oder eine Kopie erstellen:

  • Ermöglicht die einfache Überprüfung der Änderungen.
  • Ermöglicht bei Bedarf ein Rollback.

Sie können einige sehr ärgerliche Probleme mit Hühnchen und Eiern bekommen, wenn Sie Pech haben oder einen Fehler machen.


Andere Probleme:

Wenn Sie mehrere DLLs haben, stellen Sie sicher, dass Sie nicht in das falsche Projekt generieren . Die Meldung "Build fehlgeschlagen" kann aus vielen Gründen auftreten. Am dümmsten ist es jedoch, wenn Sie EFCore nicht in dem Projekt installiert haben, in dem Sie sich befinden.

In der Paketmanagerkonsole gibt es ein Default projectDropdown-Menü, in dem wahrscheinlich Ihre neuen Dateien landen, wenn Sie eine erwartete Änderung verpassen.

Eine bessere Lösung, als daran zu denken, ein Dropdown-Menü festzulegen, besteht darin, den -ProjectSchalter zu Ihrem Gerüstbefehl hinzuzufügen .

Dies ist der vollständige Befehl, den ich verwende:

Für EF Core 2

Scaffold-DbContext -Connection "Server = (lokal); Datenbank = DefenderRRCart; Integrierte Sicherheit = True; Trusted_Connection = True;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

Für EF Core 3

dotnet ef dbcontext scaffold "Server = tcp: XXXXX.database.windows.net, 1433; Anfangskatalog = DATABASE_NAME; Persist Security Info = False; User ID = USERNAME; Password = PASSWORD; MultipleActiveResultSets = False; Encrypt = True; TrustServerCert ; Verbindungszeitlimit = 30; " Microsoft.EntityFrameworkCore.SqlServer -o DB.Models --context-dir DB.Contexts --context RRDBContext --project RR.EF.csproj --force --use-database-names

Hinweis: -force überschreibt Dateien, entfernt jedoch keine nicht mehr vorhandenen. Wenn Sie Tabellen aus Ihrer Datenbank löschen, müssen Sie die alten Entitätsdateien selbst löschen (sortieren Sie im Explorer einfach nach Datum und löschen Sie die alten).


Vollständige Gerüstreferenz:

EF Core 2:

https://docs.efproject.net/de/latest/miscellaneous/cli/powershell.html#scaffold-dbcontext (this

EF Core 3:

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet

Simon_Weaver
quelle
Stellen Sie
Und ja, Sie können ein Gerüst in ein 'Klassenbibliothek'-Projekt einbauen, wenn Sie Ihre Datenzugriffslogik in einer separaten Datei bevorzugen, aber das primäre Projekt muss ein Aspnet-Kernprojekt sein
Simon_Weaver
Tipp: Stellen Sie sicher, dass Sie über die Paketmanagerkonsole ausgeführt werden. Funktioniert nicht für mich, wenn ich von der Visual Studio-Eingabeaufforderung aus
laufe
1
Was tun Sie, wenn Sie beispielsweise eine Entitätsdatei entfernt haben? Das Gerüst funktioniert nicht, weil Sie diese Datei vermissen, aber es funktioniert nicht, weil es nicht erstellt wird. Ziemlich nervig.
Sofsntp
6
Ärgerlicherweise müssen Sie in der Lage sein, die gesamte Lösung zu erstellen. Ich hatte Fehler in anderen Projekten, aber das Projekt zum Gerüst war in Ordnung. Die Lösung bestand darin, die anderen Projekte auszuwählen und sie zu "entladen". Dann Gerüst, dann nachladen.
Sam
11

Ich weiß, dass dies alt ist, aber ich habe eine Weile versucht, dies heute herauszufinden, also hoffe ich, dass dies jemandem hilft.

Ich habe ein .Net Core-Projekt, möchte aber meine Dateien in eine .Net Standard-Klassenbibliothek einbinden. DbContext-Scaffoldin der Paketmanager-Konsole hat bei mir nicht funktioniert, aber dotnet ef dbcontext scaffoldin einer regulären Eingabeaufforderung.

Ich musste diese Pakete in meiner Klassenbibliothek installieren:

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

Ich musste ein .Net Core-Projekt als Startprojekt in meiner Lösung festlegen und dieses Projekt musste einen Verweis auf meine Klassenbibliothek haben . Ich denke, dieser letzte Teil hat mir gefehlt und mich so lange am Kopf gekratzt.

Schließlich habe ich über eine Eingabeaufforderung in die Klassenbibliothek aufgenommen und Folgendes ausgeführt:

dotnet ef dbcontext scaffold "<connection string>" Microsoft.EntityFrameworkCore.SqlServer -o <output folder> -s <relative path to my startup project>
melicent
quelle
11

Durch manuelles Erstellen des Projekts durch Drücken von Strg + Umschalt + B konnte ich die Fehler erkennen, die dazu führten, dass der Build fehlschlug.

Mxaza
quelle
Yah, das Zusammenstellen der Lösung hat mir auch geholfen.
Piero Alberto
Wie die akzeptierte Antwort schon Jahre zuvor sagte. "Stellen Sie sicher, dass Ihr Projekt vollständig erstellt ist, bevor Sie einen neuen Gerüstbefehl ausführen."
Gert Arnold vor
5

Stellen Sie sicher, dass Ihr Projekt nicht ausgeführt wird. Aus irgendeinem Grund funktioniert dieser Befehl nicht, während meine API im Hintergrund ausgeführt wird.

Josh Siegl
quelle
4

Ich hatte dieses Problem immer noch, auch wenn ich sicherstellte, dass mein Projekt (auf dem EF Core installiert war) korrekt erstellt wurde. Es schlug immer noch mit "Build fehlgeschlagen" fehl. Nachricht, die bei Verwendung des -VerbsoseFlags sichtbar ist .

Ich musste dies in meinem Fall tun:

  • Erstellen Sie eine wegwerfbare ASP.NET Core-Webanwendungslösung
  • Fügen Sie der Lösung das EF Core NuGet-Paket hinzu
  • Fügen Sie das NuGet-Paket des EF Core Sql Server-Anbieters hinzu (da ich SqlServer verwende).
  • Fügen Sie das NuGet-Paket EF Core Tools hinzu
  • Wechseln Sie -Projectin den Befehl zur Paketmanager-Konsole, um auf mein neu erstelltes (und von EF Core bereitgestelltes) Projekt zu verweisen. Der letzte Schritt war nur aus gutem Grund, da meine Wegwerflösung nur ein Projekt enthielt.

Es scheint, dass dieser gesamte Prozess ein ASP.NET-Kernprojekt (oder nur ein .NET-Kernprojekt, das keine Klassenbibliothek ist) irgendwo in der Lösung erfordert, vermutlich auch als Lösungsstartprojekt festgelegt.

bcr
quelle
1
Dies ist wahrscheinlich einer der nützlicheren Einträge auf dieser Seite. Die -verbose-Flagge sollte in die richtige Richtung drücken, da sie die Vielzahl von Dingen abdeckt, die mit dem Gerüst schief gehen können.
Regianni
4

Mit VS2017 Preview 3, .NET Core 2 (VORSCHAU) hatte ich alle möglichen Probleme, aber schließlich habe ich den oben vorgeschlagenen Ansatz gewählt und eine brandneue Lösung erstellt.

  1. Neue .NET Core-Lösung erstellt
  2. Projektdatei bearbeitet und 1.0 in 2.0 geändert: <TargetFramework>netcoreapp2.0</TargetFramework>
  3. Geschlossene / wieder geöffnete Lösung

Dann wurde das Entity Framework hinzugefügt:

  1. In der PackageManager-Konsole:
    • Installationspaket Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0-Preview2-Final
    • Installationspaket Microsoft.EntityFrameworkCore.Tools -Version 2.0.0-Preview2-Final
    • Installationspaket Microsoft.EntityFrameworkCore.Design -Version 2.0.0-Preview2-Final
  2. Projektdatei bearbeitet und hinzugefügt: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

Dann;

  1. Öffnete die Powershell-Eingabeaufforderung und änderte das Verzeichnis in den Scaffold-Projektordner
  2. Ran: dotnet ef dbcontext scaffold "Server = DESKTOP-MB70B7U; Datenbank = ForexForme; Trusted_Connection = True" Microsoft.EntityFrameworkCore.SqlServer -o Modelle
    • Wo Sie Ihre eigene Verbindungszeichenfolge eingeben!
    • Models ist der Name meines Verzeichnisses, in das ich alle meine Klassen eingefügt habe
James Joyce
quelle
4

Erstellen Sie eine Komplettlösung und sehen Sie, wo sie fehlschlägt. Ich hatte einige NuGet-Projekte in einem Ordner versteckt, der nicht erstellt wurde. Erst beim Wiederaufbau der Lösung fand ich heraus, wo das Problem lag. Alles muss gebaut werden, sonst fällt das Gerüst aus.

Guido Neele
quelle
3

Für mich bestand das Problem darin, dass ich versuchte, es in einem neuen leeren Konsolenprojekt innerhalb der Lösung einzurichten, das keine Dateien enthielt. Daher versuchte das Gerüst, dieses Projekt als Startprojekt zu verwenden und konnte es nicht finden Main. Ich habe es behoben, indem ich eine neue Datei mit einer leeren Hauptdatei hinzugefügt habe

Austin_Anderson
quelle
3

Dank des oben Gesagten wurde dies durch die Neuerstellung der Projektlösung gelöst. Einige wichtige Vorbehalte für mich persönlich waren:

  1. Das Laufen dotnet buildwar nicht genug (ich hatte angenommen, dass es das war)!
  2. Wählen Sie im Visual Studio-Menü Build> Build-Lösung (Strg + Umschalt + B).
    • Ich glaube, ich habe einfach versucht, den dotnet buildBefehl in einem untergeordneten Projekt (myProject.data) auszuführen.
    • Der Schlüssel bestand darin, die übergeordnete Projektlösung (myProject) neu zu erstellen

Ich hoffe das hilft jemand anderem, der genauso verwirrt war!

Joel Balmer
quelle
2

Wenn Sie mehrere Projekte in der Lösung verwenden, überprüfen Sie das Standardprojekt im Paketmanager.

Muhammet Bozkan
quelle
2

Ich löste es mit einem Rechtsklick auf Projekte und "Projekt entladen" ließ nur das EF-Projekt und führte die Befehle aus

user1499903
quelle
1

Wenn das Entity-Framework zurückkehrt build failed, liegt höchstwahrscheinlich ein Fehler in einem Ihrer Projekte vor.

Selbst wenn das Projekt, für das Sie den Befehl ausführen, sauber und fehlerfrei ist, können andere Projekte in dieser Lösung die build failedAntwort verursachen.

Lösung

  • Erstellen Sie die gesamte Lösung neu. Höchstwahrscheinlich werden Sie diesen Fehler beim Wiederherstellen der Lösung finden.
  • Stellen Sie sicher, dass das Projekt, für das Sie den Befehl ausführen möchten, in der Default projectDropdown-Liste ausgewählt istPackage Manager Console
  • Führen Sie den Befehl erneut aus.
Inam Ul Huq
quelle
1

Mein Projekt wurde in Visual Studio erstellt, aber ich musste beim Ausführen von Scaffold-DbContext eine Version für "Microsoft.AspNetCore.App" angeben.

Also statt:

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeFrameworkVersion>2.1.6</RuntimeFrameworkVersion>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App"/>
</ItemGroup>

Ich musste haben:

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.6" />
</ItemGroup>
Cpt.Ohlund
quelle
1

Stellen Sie sicher, dass Ihr Build einwandfrei funktioniert.
Führen Sie den Gerüstbefehl über die Paketkonsole aus. Ihr Befehl sollte funktionieren:

Scaffold-DbContext 'Data Source=TEST-XY010;Initial Catalog=TESTDB;Trusted_Connection=True' Microsoft.EntityFrameworkCore.SqlServer -Context HOPWAContext -OutputDir TESTModel -Force
Shakil
quelle
1

Ich habe es behoben, indem ich meinen Server gestoppt und dann erneut ausgeführt habe.

tblev
quelle
0

Das hat heute bei mir aufgehört zu arbeiten. Also habe ich versucht, den Befehl dotnet scaffold über die Befehlszeile auszuführen, und es hat beim ersten Mal funktioniert. Frag mich nicht !!

Regianni
quelle
Es brach erneut, bevor ich das Flag --verbose entdeckte, das die Stapelverfolgung lieferte, mit der ich das Problem identifizieren konnte. Würde wahrscheinlich helfen, wenn der Fehler unabhängig von diesem Flag ausgegeben würde.
Regianni
-1

Stellen Sie sicher, dass Sie alle Pakete haben, und drücken Sie Strg + Umschalt + b, um die Lösung zu erstellen. Es funktioniert bei mir.

Ivan Cardozo
quelle
Wie die akzeptierte Antwort schon Jahre zuvor sagte. "Stellen Sie sicher, dass Ihr Projekt vollständig erstellt ist, bevor Sie einen neuen Gerüstbefehl ausführen."
Gert Arnold vor
-1
  1. Stellen Sie sicher, dass Ihr Projekt nicht ausgeführt wird
  2. Stellen Sie sicher, dass Ihr Projekt kompiliert wird

Das hat bei mir funktioniert.

José Maurício
quelle