47
votes

I was wondering if I could set-up my EntityFrameworkCore in a .NET Standard 2.0 project easily. I was following this Tutorial but it requires either .NET Core or Framework.

When I got to this step:

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

I got this error:

Startup project 'projectName' targets framework '.NETStandard'. There is no runtime associated with this framework, and projects targeting it cannot be executed directly. To use the Entity Framework Core Package Manager Console Tools with this project, add an executable project targeting .NET Framework or .NET Core that references this project, and set it as the startup project; or, update this project to cross-target .NET Framework or .NET Core.

I am wondering if I could set-up my entity in .NET Standard or if there a best practice that I should be doing instead?

8
Check this out. Also make sure in your .csproj you have <TargetFramework>netstandard2.0</TargetFramework> and you are using Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0Matthew Alltop
I am still getting the same error and I have Microsoft.EntityFrameworkCore.SqlServer 2.0.1 installed if that makes a differenceJoe Jazdzewski

8 Answers

41
votes

Startup project 'projectName' targets framework '.NETStandard'. There is no runtime associated with this framework, and projects targeting it cannot be executed directly. To use the Entity Framework Core Package Manager Console Tools with this project, add an executable project targeting .NET Framework or .NET Core that references this project, and set it as the startup project; or, update this project to cross-target .NET Framework or .NET Core.

The error message means this: There is no such thing as an executable .NET Standard project. There is no runtime for it because it is simply a type-forwarding mechanism for multiple different runtimes.

In programming terms, it is a bit like trying to instantiate an interface. You can't do it because there is no implementation to run.

The solution is to pick an executable platform for your application to run on. You can reference as many .NET Standard libraries as you like from your executable (as long as they are compatible with your runtime), but the executable itself cannot be run on .NET Standard. It must target a platform such as .NET Framework or .NET Core in order to execute.

In other words, in order to use a command to scaffold your database, you have to target a runtime. So you will either need to run this command while targeting your main executable project or add a new executable project to your solution to run it on.

You can do this running your command on the CLI with the option --startup-project=[Path_to_your_main_Project]

12
votes
  1. Right-clicking the .NET Core app in your project

  2. Clicking Set as StartUp Project

enter image description here

6
votes

You can run dotnet ef migrations against .NET Standard projects by creating a .NET Core project, adding your .NET Standard project as a reference, then using the --project and --startup-project to specify which project to run the migrations against.

dotnet ef migrations add MyNewMigrationName --project [pathToNetStandardProject] --startup-project [pathToNetCoreProject]

3
votes

I'm actually trying to do this also. I got the scaffolding but Net Standard doesn't seem to load the extensions for table properties.

Make sure you install the EntityFrameworkCore.Tools package for EF. You only need 4.6.1 support which is the default. If I figure out how to fix the extensions issue I'll post here.

These two are required:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools

3
votes

The issue here is this particular line in your .csproj file

<TargetFramework>netstandard2.0</TargetFramework>

change it to

<TargetFramework>netcoreapp2.1</TargetFramework>

or whatever the version of .net core your main project is targetting, It worked for me, it should work for you too!! :)

1
votes

The following works from the dotnet CLI assuming you already have a executable startup project in the solution:

dotnet ef dbcontext scaffold "Server=myServerName; Database=dbName; User Id=someUser; Password=myPassword123;" Microsoft.EntityFrameworkCore.SqlServer  --project ../MyLibraryProject/ -c MyDbContext -o FolderName

you can find more information here:

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet#other-target-frameworks

1
votes

Step1:
Add ProjectReference your project .netstandar".

Step2:
You can use the parameter -Project "your project .netstandar".

1
votes

I will share my experience as well, maybe it saves time for others.

In my case I had set multiple projects as startup projects, running the migration gave me this error which the questions state.

SOLUTION:

I changed multiple startup projects to a single project, and migration generated successfully!