"Error de compilación" en Database First Scaffold-DbContext

81

Estoy tratando de generar clases a partir de una base de datos (primer enfoque de la base de datos de EntityFramework).

Para mayor comodidad, estoy más o menos siguiendo este tutorial: https://docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html

Estoy en un punto en el que estoy ejecutando el equivalente de esta línea de código en la consola de Visual Studio Package Manager:

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

Esta línea de código está generando el error (con el modo -Verbose activado):

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

No veo otras opciones que produzcan resultados significativos y no veo documentación sobre este error en particular. Si sirve de algo, este proyecto no tiene un archivo project.json, actualmente. Todo está en el archivo .csproj, que no he editado manualmente.

LightToTheEnd
fuente
6
¿Recibe algún error / advertencia cuando vuelve a compilar la solución completa?
Ignas
@Ignas Hizo eso, y sí, obtuve errores de dependencia que no existían antes de volver a compilar, y que simplemente no deberían haber existido. En lugar de intentar combatirlo, rehice la solución. Sin embargo, ahora tengo un nuevo problema. Supongo que debería hacer una nueva pregunta después de un rato (si esta es similar) en lugar de editar esta.
LightToTheEnd
Piense que su problema es que debe tener un project.json para poder declarar las herramientas EFC. Intente reescribir en el tipo de proyecto correcto y esto podría generar un json.
Webezine
1
Para mí, lo que hizo que funcionara fue asegurarme de que toda la solución (no solo el proyecto) se compile correctamente antes de emitir el comando scaffold.
manish gupta
Quería actualizar brevemente esta pregunta, ya que recibió mucha atención: se trataba de una compilación de EF Core mucho más antigua que la que está disponible actualmente, y después de varios otros problemas, la solución con la que terminamos fue EF6 hasta que Core tuvo más tiempo para asentarse. Incluso EF6 planteó problemas, pero lo configuramos de manera mucho más confiable.
LightToTheEnd

Respuestas:

152

Dos consejos más importantes:

[1] - Asegúrese de que su proyecto se compile por completo antes de ejecutar un nuevo comando de andamio.

De otra manera...

  • Empezarás a escribir una línea de código.
  • Se dará cuenta de que falta una columna de base de datos requerida en su modelo.
  • Irás a intentar montarlo.
  • Veinte minutos después, se dará cuenta de que la razón por la que su compilación (y el comando de scaffold) está fallando es porque literalmente tiene una línea de código escrita a medias. ¡Ups!

[2] - Verifique el control de fuente o haga una copia:

  • Le permite verificar fácilmente qué cambió.
  • Permite la reversión si es necesario.

Puede tener algunos problemas muy molestos del tipo "huevo y la gallina" si no tiene suerte o comete un error.


Otros problemas:

Si tiene varias DLL, asegúrese de no generar en el proyecto incorrecto . Un mensaje de 'Error de compilación' puede ocurrir por muchas razones, pero la más tonta sería si no tiene EFCore instalado en el proyecto en el que está realizando el andamio.

En la consola del administrador de paquetes hay un Default projectmenú desplegable y probablemente ahí es donde terminaron sus nuevos archivos si le falta un cambio esperado.

Una mejor solución que recordar establecer un menú desplegable es agregar el -Projectinterruptor a su comando de andamio.

Este es el comando completo que uso:

Para EF Core 2

Scaffold-DbContext -Connection "Servidor = (local); Base de datos = DefenderRRCart; Seguridad integrada = True; Trusted_Connection = True;" -Proveedor Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

Para EF Core 3

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

Nota: -force sobrescribirá los archivos, pero no eliminará los que ya no existen. Si elimina tablas de su base de datos, debe eliminar los archivos de entidad antiguos usted mismo (simplemente ordene en Explorer por fecha y elimine los antiguos).


Referencia completa de andamios:

EF Core 2:

https://docs.efproject.net/en/latest/mis Miscellaneous / cli / powershell.html#scaffold - dbcontext (esto

EF Core 3:

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

Simon_Weaver
fuente
también asegúrese de que los archivos Project.JSON no tengan comentarios en ellos
Simon_Weaver
Y sí, puede andamiarse en un proyecto de 'biblioteca de clases' si prefiere su lógica de acceso a datos en un archivo separado, pero el proyecto principal debe ser un proyecto principal de
aspnet
Consejo: asegúrese de ejecutarlo desde la consola del administrador de paquetes. No me funciona al ejecutar desde el símbolo del sistema de Visual Studio
Simon_Weaver
1
¿Qué haces si, por ejemplo, eliminas un archivo de entidad? El andamio no funcionará porque le falta este archivo, pero no lo hará porque no se compila. Bastante molesto.
sofsntp
6
Es molesto que parezca que necesita poder construir la solución completa. Tuve errores en otros proyectos, pero el proyecto de andamio estaba bien. La solución fue seleccionar los otros proyectos y "descargarlos". Luego coloque un andamio, luego vuelva a cargar.
Sam
11

Sé que esto es viejo, pero pasé un tiempo tratando de resolverlo hoy, así que espero que esto ayude a alguien.

Tengo un proyecto .Net Core pero quiero convertir mis archivos en una biblioteca de clases .Net Standard. DbContext-Scaffolden la consola del administrador de paquetes no funcionó para mí, pero dotnet ef dbcontext scaffolden un símbolo del sistema normal lo hizo.

Tuve que instalar estos paquetes en mi biblioteca de clases:

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

Tenía que tener un proyecto .Net Core configurado como proyecto de inicio en mi solución y ese proyecto tenía que tener una referencia a mi biblioteca de clases . Creo que esa última parte es lo que me estaba perdiendo y que me mantuvo rascándome la cabeza durante tanto tiempo.

Finalmente, ingresé en la biblioteca de clases desde un símbolo del sistema y ejecuté esto:

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

La construcción manual del proyecto presionando Ctrl + Shift + B me ayudó a ver los errores que estaban causando que fallara la construcción.

Mxaza
fuente
Sí, compilar la solución también me ayudó.
Piero Alberto
Como ya decía la respuesta aceptada años antes. "Asegúrese de que su proyecto se compile por completo antes de ejecutar un nuevo comando de andamio".
Gert Arnold
5

Asegúrese de que su proyecto no se esté ejecutando, por alguna razón, este comando no funciona mientras mi API se está ejecutando en segundo plano.

Josh Siegl
fuente
4

Seguí teniendo este problema incluso cuando me aseguré de que mi proyecto (que tenía EF Core instalado) se construyera correctamente. Todavía falló con el "Error de compilación". mensaje, que es visible cuando se usa la -Verbsosebandera.

Tuve que hacer esto en mi caso:

  • Cree una solución de aplicación web ASP.NET Core desechable
  • Agregue el paquete EF Core NuGet a la solución
  • Agregue el paquete NuGet del proveedor EF Core Sql Server (porque estoy usando SqlServer)
  • Agregar el paquete EF Core Tools NuGet
  • Cambie -Projectel comando de la consola del administrador de paquetes para que apunte a mi proyecto recién creado (y aprovisionado con EF Core). El último paso fue solo por si acaso, ya que solo había un proyecto en mi solución desechable.

Parece que todo este proceso requiere un proyecto principal de ASP.NET (o simplemente un proyecto de .NET Core que no es una biblioteca de clases) en algún lugar de la solución, presumiblemente configurado también como proyecto de inicio de la solución.

bcr
fuente
1
Esta es probablemente una de las entradas más útiles de esta página. La bandera -verbose debe empujar en la dirección correcta ya que cubre la multitud de cosas que pueden salir mal con el andamio.
Regianni
4

Usando VS2017 Preview 3, .NET Core 2 (PREVIEW) tuve todo tipo de problemas, pero finalmente tomé el enfoque sugerido anteriormente y creé una nueva solución.

  1. Creación de una nueva solución .NET Core
  2. Archivo de proyecto editado y cambiado 1.0 a 2.0: <TargetFramework>netcoreapp2.0</TargetFramework>
  3. Solución cerrada / reabierta

Luego, agregó Entity Framework:

  1. En la consola de PackageManager:
    • Paquete de instalación Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0-preview2-final
    • Paquete de instalación Microsoft.EntityFrameworkCore.Tools -Version 2.0.0-preview2-final
    • Paquete de instalación Microsoft.EntityFrameworkCore.Design -Version 2.0.0-preview2-final
  2. Archivo de proyecto editado y agregado: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

Entonces;

  1. Abrió el símbolo del sistema de Powershell y cambió el directorio a la carpeta del proyecto Scaffold
  2. Ejecutó: dotnet ef dbcontext scaffold "Server = DESKTOP-MB70B7U; Database = ForexForme; Trusted_Connection = True" Microsoft.EntityFrameworkCore.SqlServer -o Modelos
    • ¡Dónde pones tu propia cadena de conexión!
    • Modelos es el nombre de mi directorio donde pongo todas mis clases
James Joyce
fuente
4

Cree una solución completa y vea dónde falla. Tenía algunos proyectos NuGet ocultos en una carpeta que no se compiló. Solo mientras reconstruía la solución descubrí cuál era el problema. Todo debe construirse o, de lo contrario, Scaffold fallará.

Guido Neele
fuente
3

Para mí, el problema era que estaba tratando de configurarlo en un nuevo proyecto de consola en blanco dentro de la solución, que no tenía archivos, por lo que el andamio intentó usar este proyecto como un proyecto de inicio y no pudo encontrarlo Main. Lo arreglé agregando un nuevo archivo con un archivo principal vacío

Austin_Anderson
fuente
3

Gracias a lo anterior, la reconstrucción de la solución del proyecto resolvió esto. Algunas advertencias cruciales para mí personalmente fueron:

  1. ¡Ejecutar el dotnet buildno era suficiente (había asumido que lo era)!
  2. En el menú de Visual Studio, Build> Build solution (Ctrl + Shift + B)
    • Creo que simplemente estaba tratando de ejecutar el dotnet buildcomando mientras estaba dentro de un proyecto secundario (myProject.data)
    • Reconstruir la solución del proyecto principal (myProject) fue la clave

¡Espero que ayude a alguien más que estaba igualmente confundido!

Joel Balmer
fuente
2

Si usa varios proyectos en la solución, verifique el proyecto predeterminado en el administrador de paquetes.

Muhammet Bozkan
fuente
2

Lo resolví haciendo clic derecho en proyectos y "Descargar proyecto" dejé solo el proyecto EF y ejecutar los comandos

usuario1499903
fuente
1

Si el marco de entidad regresa build failed, lo más probable es que tenga algún tipo de error en cualquiera de sus proyectos.

Incluso si el proyecto en el que está ejecutando el comando está limpio y sin errores, otros proyectos en esa solución pueden causar la build failedrespuesta.

Solución

  • Reconstruya toda la solución. Lo más probable es que encuentre ese error en el proceso de reconstrucción de la solución.
  • Asegúrese de que el proyecto en el que desea ejecutar el comando esté seleccionado en el Default projectmenú desplegable dentroPackage Manager Console
  • Vuelva a ejecutar el comando.
Inam Ul Huq
fuente
1

Para mí, mi proyecto se construyó en Visual Studio, pero tuve que especificar una versión para "Microsoft.AspNetCore.App" al ejecutar Scaffold-DbContext.

Entonces en lugar de:

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

Yo tenía que tener:

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

Asegúrate de que tu construcción funcione bien.
Ejecute el comando scaffold desde la consola del paquete, su comando debería funcionar:

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

Lo resolví deteniendo mi servidor y luego ejecutándolo nuevamente.

tblev
fuente
0

Esto dejó de funcionar para mí hoy. Así que intenté ejecutar el comando dotnet scaffold desde la línea de comandos y funcionó la primera vez. ¡¡No me preguntes !!

Regianni
fuente
Se rompió de nuevo antes de que descubriera la bandera --verbose, que entregó el stacktrace que me permitió identificar el problema. Probablemente ayudaría si el error se emitiera independientemente de esta bandera.
Regianni
-1

Asegúrese de tener todos los paquetes y presione ctrl + shift + b para construir la solución. Me funciona.

Iván Cardozo
fuente
Como ya decía la respuesta aceptada años antes. "Asegúrese de que su proyecto se compile por completo antes de ejecutar un nuevo comando de andamio".
Gert Arnold
-1
  1. Asegúrese de que su proyecto no se esté ejecutando
  2. Asegúrese de que su proyecto se esté compilando

Eso funcionó para mí.

José Maurício
fuente