web-dev-qa-db-fra.com

"La construction a échoué" sur la première base de données Scaffold-DbContext

J'essaie de générer des classes à partir d'une base de données (première approche de la base de données EntityFramework).

Pour plus de commodité, je marche plus ou moins avec ce tutoriel: https://docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html

J'exécute l'équivalent de cette ligne de code dans la console de Visual Studio Package Manager:

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

Cette ligne de code génère l'erreur (avec le mode -Verbose activé):

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

Je ne vois aucune autre option produisant une sortie significative, et je ne vois aucune documentation sur cette erreur particulière. Si cela peut vous aider, ce projet n’a pas de fichier project.json pour le moment. Tout se trouve dans le fichier .csproj, que je n’ai pas modifié manuellement.

35
LightToTheEnd

Tout d’abord, assurez-vous que votre projet est construit avant d’exécuter une nouvelle commande d’échafaudage. 

Ce qui m’arrive souvent, c’est que je commence à écrire une ligne de code, à réaliser qu’une nouvelle colonne de base de données est nécessaire, à essayer de l’échafauder - puis, au bout de 20 minutes, à la raison pour laquelle ma commande de construction (et ma commande d’échafaudage) échoue. avoir une ligne de code à moitié écrite. Oops.


Si vous avez plusieurs DLL, vous générez peut-être dans le mauvais projet. Ensuite, "Build failed" (échec de la construction) se produit pour un certain nombre de raisons, probablement parce que EFCore n'est pas installé dans ce projet.

Dans la console du gestionnaire de paquets, il y a un Default project et c'est probablement là que vos fichiers se sont retrouvés.

La solution est simple et il vous suffit d’ajouter le commutateur -Project à vos options.

C'est la commande complète que j'utilise:

Scaffold-DbContext -Connection "Serveur = (local); Base de données = DefenderRRCart; Intégré Sécurité = True; Trusted_Connection = True;" -Fournisseur Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

Remarque: -force écrasera les fichiers mais ne supprimera pas ceux qui n'existent plus. Si vous supprimez des tables de votre base de données, vous devez supprimer vous-même les anciens fichiers d'entité (il suffit de trier dans Explorer par date et de supprimer les anciens).

Options complètes: https://docs.efproject.net/fr/latest/misc Miscellaneous/cli/powershell.html#scaffold-dbcontext

73
Simon_Weaver

Construire manuellement le projet Ctrl + Maj + B m'a aidé à voir comment récupérer les erreurs qui causaient l'échec de la construction.

3
Mxaza

Je sais que c'est vieux, mais j'ai passé un moment à essayer de comprendre cela aujourd'hui, alors j'espère que cela aidera quelqu'un.

J'ai un projet .Net Core mais je souhaite scaffolder mes fichiers dans une bibliothèque de classes .Net Standard. DbContext-Scaffold dans la console du gestionnaire de paquets ne fonctionnait pas pour moi, mais dotnet ef dbcontext scaffold dans une commande ordinaire Invite, si.

Je devais installer ces paquets dans ma bibliothèque de classes:

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

Je devais avoir un projet .Net Core défini comme projet de démarrage dans ma solution et ce projet devait avoir une référence à ma bibliothèque de classes . Je pense que cette dernière partie est ce qui me manquait et m'a gardé à me gratter la tête pendant si longtemps.

Enfin, je suis entré dans la bibliothèque de classe à partir d'une invite de commande et j'ai lancé ceci:

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

Pour moi, le problème était que j'essayais de l'installer dans un nouveau projet de console vierge dans la solution, qui ne contenait aucun fichier. L'échafaudage a donc essayé d'utiliser ce projet en tant que projet de démarrage et n'a pas trouvé Main. Je l'ai corrigé en ajoutant un nouveau fichier avec un fichier principal vide

2
Austin_Anderson

Utilisation de VS2017 Preview 3, .NET Core 2 (PREVIEW) J'avais toutes sortes de problèmes, mais j'ai finalement adopté l'approche suggérée ci-dessus et créé une toute nouvelle solution.

  1. Création d'une nouvelle solution .NET Core
  2. Fichier de projet modifié et modifié 1.0 à 2.0: <TargetFramework>netcoreapp2.0</TargetFramework>
  3. Solution fermée/ré-ouverte

Puis, ajouté le Entity Framework:

  1. Dans la console PackageManager:
    • Package d'installation Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0-preview2-final
    • Package d'installation Microsoft.EntityFrameworkCore.Tools -Version 2.0.0-preview2-final
    • Package d'installation Microsoft.EntityFrameworkCore.Design -Version 2.0.0-preview2-final
  2. Fichier de projet édité et ajouté: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

Ensuite;

  1. Ouverture de l'invite de commande Powershell et changement de répertoire dans le dossier Scaffold Project 
  2. Ran: dotnet ef dbcontext scaffold "Serveur = BUREAU-MB70B7U; Base de données = ForexForme; Trusted_Connection = True" Microsoft.EntityFrameworkCore.SqlServer -o Modèles
    • Où vous mettez dans votre propre chaîne de connexion!
    • Modèles est le nom de mon répertoire où je mets toutes mes classes
2
James Joyce

Construisez une solution complète et voyez où elle échoue. Certains projets NuGet étaient cachés dans un dossier qui ne s’était pas construit. Seulement en reconstruisant la solution, j'ai découvert quel était le problème. Tout doit être construit sinon l'échafaudage échouera.

1
Guido Neele

Je rencontrais toujours ce problème même lorsque je m'assurais que mon projet (sur lequel EF Core était installé) était construit correctement. Il a toujours échoué avec le "Build failed." message visible lors de l’utilisation de l’indicateur -Verbsose.

Je devais le faire dans mon cas: 

  • Créer une solution d'application Web ASP.NET Core jetable
  • Ajouter le package EF Core NuGet à la solution
  • Ajoutez le package NuGet du fournisseur EF Core Sql Server (car j'utilise SqlServer).
  • Ajouter le package EF Core Tools NuGet
  • Basculez -Project dans la commande de console du gestionnaire de packages pour pointer vers mon projet nouvellement créé (et fourni par EF Core). La dernière étape était juste pour faire bonne mesure, car il n’y avait qu’un seul projet dans ma solution jetable.

Il semble que tout ce processus nécessite un projet principal ASP.NET (ou tout simplement un projet .NET Core qui n'est pas une bibliothèque de classes) quelque part dans la solution, probablement défini comme projet de démarrage de la solution.

1
bcr

Si entity-framework renvoie build failed, vous avez probablement une erreur dans l'un de vos projets.

Même si le projet sur lequel vous exécutez la commande est propre et sans erreur, les autres projets de cette solution peuvent provoquer la réponse build failed.

Solution

  • Reconstruisez toute la solution. Très probablement, vous trouverez cette erreur dans le processus de reconstruction de solution.
  • Assurez-vous que le projet sur lequel vous souhaitez exécuter la commande est sélectionné dans la liste déroulante Default project dans Package Manager Console.
  • Relancez la commande.
0
Inam Ul Huq

Pour moi, mon projet était construit dans Visual Studio, mais je devais spécifier une version pour "Microsoft.AspNetCore.App" lors de l'exécution de Scaffold-DbContext.

Donc au lieu de: 

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

Je devais avoir:

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

Assurez-vous que votre projet ne fonctionne pas. Pour une raison quelconque, cette commande ne fonctionne pas lorsque mon API est exécutée en arrière-plan. 

0
Josh Siegl