102
votes

I'm trying to generate classes from a database (EntityFramework's database first approach).

For convenience, I'm more or less walking along with this tutorial: https://docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html

I'm at a point where I am running the equivalent of this line of code in the Visual Studio Package Manager Console:

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

This line of code is generating the error (with -Verbose mode on):

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

I see no other options that produce any meaningful output, and I see no documentation on this particular error. If it helps at all, this project does not have a project.json file, currently. Everything is in the .csproj file, which I have not manually edited.

20
Do you get any errors/warnings when you recompile the whole solution?Ignas
@Ignas Did that, and yes, I got dependency errors that didn't exist before I recompiled, and that just shouldn't have existed. Rather than try to fight it, I remade the solution. I have a new problem now, though. Guess that I should make a new question after a bit (if this one is similar) as opposed to editing this one.LightToTheEnd
Think your issue is that you have to have a project.json in order to declare the EFC tools. Try rewriting in the correct project type and this could generate a json.Webezine
For me, what got it working was to make sure the entire solution ( not just the project) builds successfully before issuing the scaffold command.manish gupta
I wanted to briefly update this question since it got a lot of attention - this was on a much older build of EF Core than what is currently available, and after several other problems, the solution that we ended up going with was EF6 until Core had more time to settle. Even EF6 posed problems, but we got it set up much more reliably.LightToTheEnd

20 Answers

190
votes

Two most important tips:

[1] - Make sure that your project builds completely before you run a new scaffold command.

Otherwise...

  • You'll start writing a line of code.
  • You'll realize a required DB column is missing from your model.
  • You'll go to try to scaffold it.
  • Twenty minutes later you'll realize the reason your build (and scaffold command) is failing is because you literally have a half written line of code. Oops!

[2] - Check into source control or make a copy:

  • Allows you to easily verify what changed.
  • Allows rollback if needed.

You can get some very annoying 'chicken and egg' problems if you get unlucky or make a mistake.


Other problems:

If you have multiple DLLs make sure you aren't generating into the wrong project. A 'Build failed' message can occur for many reasons, but the dumbest would be if you don't have EFCore installed in the project you're scaffolding into.

In the package manager console there is a Default project dropdown and that's probably where your new files ended up if you're missing an expected change.

A better solution than remembering to set a dropdown is to add the -Project switch to your scaffolding command.

This is the full command I use:

For EF Core 2

Scaffold-DbContext -Connection "Server=(local);Database=DefenderRRCart;Integrated Security=True;Trusted_Connection=True;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

For 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;Connection Timeout=30;" Microsoft.EntityFrameworkCore.SqlServer -o DB.Models --context-dir DB.Contexts --context RRDBContext --project RR.EF.csproj --force --use-database-names

Note: -force will overwrite files but not remove ones that don't exist any more. If you delete tables from your DB you must delete the old entity files yourself (just sort in Explorer by date and delete the old ones).


Full Scaffolding reference:

EF Core 2:

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

EF Core 3:

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

17
votes

Manually building the project by pressing Ctrl+Shift+B helped me to see the errors that were causing the build to fail.

13
votes

I know this is old, but I spent a while trying to figure this out today, so I hope this helps someone.

I have a .Net Core project but I want to scaffold my files into a .Net Standard class library. DbContext-Scaffold in the package manager console didn't work for me, but dotnet ef dbcontext scaffold in a regular command prompt did.

I had to install these packages in my class library:

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

I had to have a .Net Core project set as the startup project in my solution and that project had to have a reference to my class library. I think that last part is what I was missing that kept me scratching my head for so long.

Finally, I cd'd into the class library from a command prompt and ran this:

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

I still had this problem even when I ensured that my project (which had EF Core installed) built correctly. It still failed with the "Build failed." message, which is visible when using the -Verbsose flag.

I had to do this in my case:

  • Create a throw-away ASP.NET Core web application solution
  • Add the EF Core NuGet package to the solution
  • Add the EF Core Sql Server provider NuGet package (because I'm using SqlServer)
  • Add the EF Core Tools NuGet package
  • Switch -Project in the package manager console command to point to my newly-created (and EF Core-provisioned) project. The last step was just for good measure, since there was only one project in my throw-away solution.

It seems that this whole process requires an ASP.NET core project (or just a .NET Core project that isn't a class library) somewhere in the solution, presumably set as the solution startup project too.

5
votes

Make sure your project isn't running, for some reason this command doesn't work while my API is running in the background.

4
votes

Using VS2017 Preview 3, .NET Core 2 (PREVIEW) I had all sorts of issues, but eventually I took the approach suggested above and created a brand new solution.

  1. Created new .NET Core solution
  2. Edited project file and changed 1.0 to 2.0: <TargetFramework>netcoreapp2.0</TargetFramework>
  3. Closed/re-opened solution

Then, added the Entity Framework:

  1. In PackageManager console:
    • Install-package Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0-preview2-final
    • Install-package Microsoft.EntityFrameworkCore.Tools -Version 2.0.0-preview2-final
    • Install-package Microsoft.EntityFrameworkCore.Design -Version 2.0.0-preview2-final
  2. Edited project file, and added: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

Then;

  1. Opened the Powershell command prompt and changed directory into Scaffold project folder
  2. Ran: dotnet ef dbcontext scaffold "Server=DESKTOP-MB70B7U; Database=ForexForme; Trusted_Connection=True" Microsoft.EntityFrameworkCore.SqlServer -o Models
    • Where you put in your own connection string!
    • Models is the name of my directory where I put all my classes
4
votes

Build complete solution and see where it fails. I had some NuGet projects hidden away in a folder that didn't build. Only while rebuilding the solution I found out what the problem was. Everything needs to build or else Scaffold will fail.

4
votes

If you use multiple projects in the solution, check the default project in the package manager.

4
votes

Thanks to the above, rebuilding the project solution solved this. Some crucial caveats for me personally were:

  1. Running the dotnet build was not enough (I had asssumed it was)!
  2. In visual studio menu, Build > Build solution (Ctrl + Shift + B)
    • I believe I was simply trying to run the dotnet build command while inside a child project (myProject.data)
    • Rebuilding the parent project (myProject) solution was the key

I hope that helps someone else who was equally confused!

3
votes

For me the issue was that I was trying to set it up in a new blank console project inside of the solution, which had no files, so the scaffolding tried to use this project as a startup project and couldn't find Main. I fixed it by adding a new file with an empty main

3
votes

If entity-framework returns build failed, most probably you have some kind of error in any of your projects.

Even if the project you are running the command on, is clean and error-free, other projects in that solution can cause the build failed response.

Solution

  • Rebuild the whole solution. Most probably you'll find that error in solution-rebuild process.
  • Make sure the project you want to run command on, is selected in Default project drop-down inside Package Manager Console
  • Re-run the command.
3
votes

I resolved it with right click on projects and "Unload Project" let only the EF project and run the commands

1
votes

For me, my project built in Visual Studio but I had to specify a version for "Microsoft.AspNetCore.App" when running Scaffold-DbContext.

So instead of:

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

I had to have:

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

Make sure your build works fine.
Run the scaffold command from the package console, your command should work:

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

I resolved it by stopping my server and then running it again.

0
votes

This stopped working for me today. So I tried running the dotnet scaffold command from the command line and it worked first time. Don't ask me!!

0
votes

I had a issue that I have some non-scaffolded code in my DbContext project (partial classes for interfaces) that relied on generated files. As part of the re-scaffold though, I delete all previously generated code and of course this causes the project to fail building and thus scaffolding.

My work around is to have a custom "Scaffold" configuration on the project that simply removes from compilation a whole subfolder where any code-gen dependent files are to live.

If this is a path for you, edit your DbContext's .csproj and add:

<ItemGroup Condition="'$(Configuration)' == 'Scaffold'">
    <Compile Remove="NonGenerated\**\*.*" />
</ItemGroup>

and change your command line to include a --configuration Scaffold parameter. A powershell sample of how I do this is as such:

# Run from DbContext project root
$DbContextProjName = "Engine.Common.Dal"
#conStr = "...." #Your ConnectionString here, or loaded otherwise
if (Test-Path "Generated"){
    Remove-Item -Recurse -Force "Generated"
}

#Entities/Context in own folder for easy delete then regen, entity-dependant files go in NonGenerated
dotnet ef dbcontext scaffold `
    $conStr `
    "Microsoft.EntityFrameworkCore.SqlServer" `
    --context DatabaseContext `
    --data-annotations --force --no-onconfiguring `
    --namespace "$($DbContextProjName)" `
    --output-dir "Generated" `
    --project "$($DbContextProjName).csproj" `
    --startup-project "$($DbContextProjName).csproj" `
    --configuration "Scaffold"
if (! $?){
    throw "dotnet ef scaffold failed!"
}
-1
votes

Make sure you have all packages and press ctrl + shift +b to build the solution. It works to me.

-1
votes
  1. Make sure your project is not running
  2. Make sure your project is compiling

That worked for me.

-1
votes

1-

Make sure the build is successful, to check to build is successful go-to solution explorer and right-click on solution name and rebuilt solution, all project will build successful and good to go.

2-

Install NuGet package Microsoft.EntityFrameworkCore.SqlServer

Install NuGet package Microsoft.EntityFrameworkCore.Tools

Install NuGet package Microsoft.EntityFrameworkCore.Design

check all the versions should be the same for NuGet packages like (3.1.3) and install inside class library if you are following onion architecture.

3-

Try now if still, it failed check db context and reference to class library should be added inside asp.net core web project.