I have .net Core 3.1 solution with WebApi and Persistance projects. WebApi is the solution's startup project, Persistance is where DbContext is defined. After a lot of reading and trying stuff, I still cannot achieve the following:
WebApi stays as the solution's startup project.
Migrations folder with all the migrations classes is in the Persistance project.
Migrations can be generated from VS Package Manager Console by typing Add-Migration <migration_name> without any additional parameters like -Project or -StartupProject.
No need to change selection in the Package Manager Console Default project dropdown.
I wanted to achieve the same result but on MAC OS. Because Visual Studio on Mac is not like Window's, We use CLI commands. In my case I had Migration Classes in another project and startup was Api project just like you so i added this to my terminal :
alias migrationfortest='dotnet ef migrations add $1 --project /Users/user/Projects/test-web/Test.Infrastructure'
and you can call this simply by typing migrationfortest "YOURMIGRATIONNAME"
NOTE : For CLI command tools you should add This
Trying to create a new console application in Visual Studio accessing an existing SQL Server database. Would like to use EF Core to scaffold models from the database.
MicroSoft's "Getting Started" instructions seem way off. They suggest using NuGet console and running
Scaffold-DbContext "Server=...." Microsoft.EntityFrameworkCore.SqlServer
This does nothing.
One source suggests running "dotnet ef dbcontext scaffold "server=....", but this errors out with:
CategoryInfo: NotSpecified: (No executable f...and "dotnet-ef":String) [], RemoteException
If I'm running dotnet ef shouldn't I been a command prompt, rather than PM console? But in which folder? Running in the project folder errors out with no executable found matching "dotnet-ef". Note that this is a console application (not ASP) and does not have Project.json, etc...
Did you install EF Nuget Package ?
Install-Package EntityFramework
https://www.nuget.org/packages/EntityFramework
When trying to scaffold with asp.net core this command
scaffold-dbcontext "Data Source=(local);Initial
Catalog=MyDb;Integrated Security=True;"
Microsoft.EntityFrameworkCore.sqlserver -outputdir Models
Gives this error.
scaffold-dbcontext : The term 'scaffold-dbcontext' is not recognized
as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify
that the path is correct and try again. At line:1 char:1
+ scaffold-dbcontext "Data Source=(local);Initial Catalog=MyDB;In ...
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (scaffold-dbcontext:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
I have tried the solution here, but it does not work for me.
Any idea what the cause/cure could be?
For me apparently it worked once I have also ran in Package Manager console :
Install-Package Microsoft.EntityFrameworkCore.Tools
Also make sure :
To have other dependencies (for example Microsoft.EntityFrameworkCore, Microsoft.EntityFrameworkCore.SqlServer, Microsoft.EntityFrameworkCore.SqlServer.Design...) referenced depending of your needs.
To select the right assembly as target for your commands in the top-right corner of the PM console (I am frequently fooled by forgetting it...)
Another problem I encountered : with the dbcontext located in a separate class library, I was encountering the following error :
Unable to find provider assembly with name
Microsoft.EntityFrameworkCore.SqlServer. Ensure the specified name is
correct and is referenced by the project.
Which I was able to fix by setting my class library as Startup project in VS (don't ask why as it seems meaningless, but it worked).
Late edit, there's something else to know : You can't run Scaffold-DbContext against a class library targetting only .Net Standard, you must also enable netcoreapp in it, or Scaffold-DbContext will complain.
To support both targets, edit the csproj to put : <TargetFrameworks>netcoreapp2.2;netstandard2.0</TargetFrameworks>
Instead of <TargetFramework> section.
After all these you'll be able to run your Scaffold-DbContext command line with proper arguments and connection string.
-- 2022 update --
I'm glad to see that post is still helpful as it receives some new upvotes, but instead of command-line scaffolding, there's a newer solution for the happy users of VS : you can rely on the retro-engineering feature of the extension EF Core Power tools.
I'm using it in all my new projects since a while and I find it much more powerful than raw command line, and it allows you to save your execution settings (which will avoid you to create a .bat with your custom command line).
Of course, it's your choice.
Had the same problem. In my case i was missing some dependencies, so make sure that you have the following one :
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Hope this would help. :)
Make sure that this is available in your project.json file "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final".
Run the command in the package manager console
that's all it will work
Make sure you run VS as Administrator and have installed the following packages:
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.SqlServer.Design
Microsoft.EntityFrameworkCore.Tools
Scaffold command is part of dbcontext command in EF. Below are the details for successful scaffold:
Package references required:
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.0.0"/>
So our scaffold command should look like:
dotnet ef dbcontext scaffold "Server=localhost\SQLEXPRESS;Database=MyDatabase;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o OutputDirectory
Your Server value might differ as per your Db server name. Replace MyDatabase with your Database name like master and OutputDirectory to the location you want your newly created scaffolded classes like Models folder.
Make sure you are using the right console, the "Package Manager Console". There is also a "Terminal" console which looks very similar, but doesn't work for this command. Package Manager Console can be found in View -> Other Windows (as of Visual Studio 2019, ver. 16.6.5)
I had installed Microsoft.EntityFrameworkCore.Tools from NuGet Package Manager and it was visible in the installed packages. But I kept getting this error.
Restarting Visual Studio (2019/Version 16.4.4) fixed it for me.
With VS2022, none of them worked.
But I installed EF
dotnet tool install --global dotnet-ef
and changed the code;
dotnet ef dbcontext scaffold "Server=servername;Database=dbname;Persist Security Info=True;User ID=XXX;Password=YYY;" Microsoft.EntityFrameworkCore.SqlServer -o Models
Also I had to install .Net 6.0 hosting bundle
https://dotnet.microsoft.com/en-us/download/dotnet/6.0/runtime?cid=getdotnetcore
For me this error was caused by extra spacing was added around the hyphens, which was for some reason added when copy pasting from the command from the docs. Removing the spacing fixed it.
causes error:
Scaffold - DbContext "Server=(localdb)\mssqllocaldb;Database=myDbName;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer - OutputDir Models
the fix:
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=myDbName;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
The docs also say if you receive this error, try restarting Visual Studio.
https://learn.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db
If you're using .NetCore 2.2 then the command below works like a charm for me either in Command Prompt (CMD) or on Git Bash.
Make sure that you are directly on the project folder before running the command.
For example C:\App\ProjectName:
dotnet ef dbcontext scaffold "Server=.\;Database=Databasename;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Model
I ran into another cause of this error recently: NuGet itself was out of date.
Updating NuGet resolved the issue.
If Devanathan's answer doesn't work for you, check to make sure NuGet itself is up to date.
If your solution has more than one project and the EF files are not in the startup project, make sure you choose the correct project here
I've done the upgrade for Visual Studio 2015 Update 3, One project is using ASP.Net Core but only for front end JS and CSS using gulp etc. I've just tried to run migrations on the project with migrations and get the following:
Update-Database is obsolete. Use Apply-Migration instead.
Using project 'ProjectName'
Build started...
Build succeeded.
Using start-up project 'MyProject'.
Using application base 'pathlocation'.
Using application configuration 'pathlocation'\Web.config'
Using data directory ''pathlocation'\App_Data'
Using assembly 'My.dll'.
Exception calling "CreateInstanceAndUnwrap" with "8" argument(s): "Could not load file or assembly 'EntityFramework.Commands' or one of its dependencies. The system cannot find the file specified."
I can't see that I've upgraded to EF 7, and I've uninstalled and reinstalled EF 6 in the project. Any suggestions as to what I'm missing?
I'm sure this was something to do with .Net Core messing up the tooling. To resolve I ran VS as admin. Removed all the EF 7 references in the packages.config in the .Net Core project. Then uninstalled and reinstalled EF 6 through Package Manager Console:
Uninstall-Package EntityFramework -Force
Install-Package EntityFramework -Pre
Using EntityFramework 7? Did you set your dnvm?
first you have to run from the cmd of your project folder this command:
dnvm upgrade
Then try again to use migration, but only from the cmd, and using the dnx command.
Example:
"dnx ef migrations add Initial"
more info: here
I'm running into a problem when enabling migrations on one of my projects.
I execute Enable-Migrations command from the Nuget Console and receive an error saying:
Exception calling "SetData" with "2" argument(s): "Type
'Microsoft.VisualStudio.TeamArchitect.ModelingProject.ModelProjectAutomationObject' in assembly
'Microsoft.VisualStudio.TeamArchitect.ModelingProject, Version=11.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable."
At D:\Solution\packages\EntityFramework.5.0.0\tools\EntityFramework.psm1:391 char:5
+ $domain.SetData('startUpProject', $startUpProject)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SerializationException
Has anyone faced this problem before that can point me in the right direction.
Environment:
.NET 4.5
Entity Framework 5
Visual Studio 2012 Update 2
Found the problem!
The issue was that the startup project in my solution was a modeling project.
For some reason when enabling migrations on my project, the module looks at libraries related to the startup project.
Changed my startup project to be a test project in the solution and everything worked.
UPDATE
Make sure your startup project contains the app.config or web.config file you want to use to connect to database. This is the file that it will be used to generate migrations even if your DbContext is located on a different project. You can set the project containing your DbContext as the startup project.
it turns out when you use code first migrations you have to specify a startup project in VS referencing the project where your migrations are defined elsewhere it wont be able to load the project.
(If you are using Code First Migrations inside Visual Studio this can happen if the startUp project for your solution does not reference the project that contains your migrations. You can either change the startUp project for your solution or use the -StartUpProjectName parameter.)
Just in case others are still having issues, I had this problem because I had both Entity Framework 6 and Entity Framework Core installed. Just running the commands defaults to EF6, I believe. After I prefaced the commands with 'EntityFrameworkCore/', it worked fine. I'm not an expert on this, so don't if that is incorrect, I apologize. (Ex. 'EntityFrameworkCore/')
Try to specify content type name:
Enable-Migrations -ContextTypeName Web.Infrastructure.ContextName
If you have several projects in the solution, you have to specify which one to apply.
(dropdown "DefaultProject" in the top of console).
I was having this issue too and realized that it couldn't connect because the startup web.config didn't contain the EF configuration details. The project that did contain it (the data layer) has the configuration info needed but that config isn't used. Simply move the EF config info from the config file where EF is being used and put it in the config of your startup project. Worked a treat for me.