Entity Framework Core tools reference - .NET Core CLI
The command-line interface (CLI) tools for Entity Framework Core perform design-time development tasks. For example, they create migrations, apply migrations, and generate code for a model based on an existing database. The commands are an extension to the cross-platform dotnet command, which is part of the .NET Core SDK. These tools work with .NET Core projects.
When using Visual Studio, consider using the Package Manager Console tools instead of the CLI tools. Package Manager Console tools automatically:
- Works with the current project selected in the Package Manager Console without requiring that you manually switch directories.
- Opens files generated by a command after the command is completed.
- Provides tab completion of commands, parameters, project names, context types, and migration names.
Installing the tools
dotnet ef
can be installed as either a global or local tool. Most developers prefer installing dotnet ef
as a global tool using the following command:
dotnet tool install --global dotnet-ef
To use it as a local tool, restore the dependencies of a project that declares it as a tooling dependency using a tool manifest file.
Update the tool using the following command:
dotnet tool update --global dotnet-ef
Before you can use the tools on a specific project, you'll need to add the Microsoft.EntityFrameworkCore.Design
package to it.
dotnet add package Microsoft.EntityFrameworkCore.Design
Verify installation
Run the following commands to verify that EF Core CLI tools are correctly installed:
dotnet ef
The output from the command identifies the version of the tools in use:
_/\__
---==/ \\
___ ___ |. \|\
| __|| __| | ) \\\
| _| | _| \_/ | //|\\
|___||_| / \\\/\\
Entity Framework Core .NET Command-line Tools 2.1.3-rtm-32065
<Usage documentation follows, not shown.>
Update the tools
Use dotnet tool update --global dotnet-ef
to update the global tools to the latest available version. If you have the tools installed locally in your project use dotnet tool update dotnet-ef
. Install a specific version by appending --version <VERSION>
to your command. See the Update section of the dotnet tool documentation for more details.
Using the tools
Before using the tools, you might have to create a startup project or set the environment.
Target project and startup project
The commands refer to a project and a startup project.
The project is also known as the target project because it's where the commands add or remove files. By default, the project in the current directory is the target project. You can specify a different project as target project by using the
option.--project
The startup project is the one that the tools build and run. The tools have to execute application code at design time to get information about the project, such as the database connection string and the configuration of the model. By default, the project in the current directory is the startup project. You can specify a different project as startup project by using the
option.--startup-project
The startup project and target project are often the same project. A typical scenario where they are separate projects is when:
- The EF Core context and entity classes are in a .NET Core class library.
- A .NET Core console app or web app references the class library.
It's also possible to put migrations code in a class library separate from the EF Core context.
Other target frameworks
The CLI tools work with .NET Core projects and .NET Framework projects. Apps that have the EF Core model in a .NET Standard class library might not have a .NET Core or .NET Framework project. For example, this is true of Xamarin and Universal Windows Platform apps. In such cases, you can create a .NET Core console app project whose only purpose is to act as startup project for the tools. The project can be a dummy project with no real code — it is only needed to provide a target for the tooling.
Why is a dummy project required? As mentioned earlier, the tools have to execute application code at design time. To do that, they need to use the .NET Core runtime. When the EF Core model is in a project that targets .NET Core or .NET Framework, the EF Core tools borrow the runtime from the project. They can't do that if the EF Core model is in a .NET Standard class library. The .NET Standard is not an actual .NET implementation; it's a specification of a set of APIs that .NET implementations must support. Therefore .NET Standard is not sufficient for the EF Core tools to execute application code. The dummy project you create to use as startup project provides a concrete target platform into which the tools can load the .NET Standard class library.
ASP.NET Core environment
You can specify the environment for ASP.NET Core projects on the command-line. This and any additional arguments are passed into Program.CreateHostBuilder.
dotnet ef database update -- --environment Production
Tip
The --
token directs dotnet ef
to treat everything that follows as an argument and not try to parse them as options. Any extra arguments not used by dotnet ef
are forwarded to the app.
Common options
Option | Short | Description |
---|---|---|
--json |
Show JSON output. | |
--context <DBCONTEXT> |
-c |
The DbContext class to use. Class name only or fully qualified with namespaces. If this option is omitted, EF Core will find the context class. If there are multiple context classes, this option is required. |
--project <PROJECT> |
-p |
Relative path to the project folder of the target project. Default value is the current folder. |
--startup-project <PROJECT> |
-s |
Relative path to the project folder of the startup project. Default value is the current folder. |
--framework <FRAMEWORK> |
The Target Framework Moniker for the target framework. Use when the project file specifies multiple target frameworks, and you want to select one of them. | |
--configuration <CONFIGURATION> |
The build configuration, for example: Debug or Release . |
|
--runtime <IDENTIFIER> |
The identifier of the target runtime to restore packages for. For a list of Runtime Identifiers (RIDs), see the RID catalog. | |
--no-build |
Don't build the project. Intended to be used when the build is up-to-date. | |
--help |
-h |
Show help information. |
--verbose |
-v |
Show verbose output. |
--no-color |
Don't colorize output. | |
--prefix-output |
Prefix output with level. |
Any additional arguments are passed to the application.
dotnet ef database drop
Deletes the database.
Options:
Option | Short | Description |
---|---|---|
--force |
-f |
Don't confirm. |
--dry-run |
Show which database would be dropped, but don't drop it. |
The common options are listed above.
dotnet ef database update
Updates the database to the last migration or to a specified migration.
Arguments:
Argument | Description |
---|---|
<MIGRATION> |
The target migration. Migrations may be identified by name or by ID. The number 0 is a special case that means before the first migration and causes all migrations to be reverted. If no migration is specified, the command defaults to the last migration. |
Options:
Option | Description |
---|---|
--connection <CONNECTION> |
The connection string to the database. Defaults to the one specified in AddDbContext or OnConfiguring . |
The common options are listed above.
The following examples update the database to a specified migration. The first uses the migration name and the second uses the migration ID and a specified connection:
dotnet ef database update InitialCreate
dotnet ef database update 20180904195021_InitialCreate --connection your_connection_string
dotnet ef dbcontext info
Gets information about a DbContext
type.
The common options are listed above.
dotnet ef dbcontext list
Lists available DbContext
types.
The common options are listed above.
dotnet ef dbcontext optimize
Generates a compiled version of the model used by the DbContext
and precompiles queries.
See Compiled models for more information.
Options:
Option | Short | Description |
---|---|---|
--output-dir <PATH> |
-o |
The directory to put files in. Paths are relative to the project directory. |
--namespace <NAMESPACE> |
-n |
The namespace to use for all generated classes. Defaults to generated from the root namespace and the output directory plus CompiledModels . |
--suffix <SUFFIX> |
The suffix to attach to the name of all the generated files. E.g. .g could be used to indicate that these files contain generated code |
|
--no-scaffold |
Don't generate a compiled model. This is used when the compiled model has already been generated. | |
--precompile-queries |
Generate precompiled queries. This is required for NativeAOT compilation if the target project contains any queries | |
--nativeaot |
Generate additional code in the compiled model required for NativeAOT compilation and precompiled queries |
Note
NativeAOT support and precompiled queries are considered experimental in EF 9 and could change dramatically in the next release.
The common options are listed above.
The following example uses the default settings and works if there is only one DbContext
in the project:
dotnet ef dbcontext optimize
The following example optimizes the model for the context with the specified name and places it in a separate folder and namespace:
dotnet ef dbcontext optimize -o Models -n BlogModels -c BlogContext
dotnet ef dbcontext scaffold
Generates code for a DbContext
and entity types for a database. In order for this command to generate an entity type, the database table must have a primary key.
Arguments:
Argument | Description |
---|---|
<CONNECTION> |
The connection string to the database. For ASP.NET Core 2.x projects, the value can be name=<name of connection string>. In that case the name comes from the configuration sources that are set up for the project. |
<PROVIDER> |
The provider to use. Typically this is the name of the NuGet package, for example: Microsoft.EntityFrameworkCore.SqlServer . |
Options:
Option | Short | Description |
---|---|---|
--data-annotations |
-d |
Use attributes to configure the model (where possible). If this option is omitted, only the fluent API is used. |
--context <NAME> |
-c |
The name of the DbContext class to generate. |
--context-dir <PATH> |
The directory to put the DbContext class file in. Paths are relative to the project directory. Namespaces are derived from the folder names. |
|
--context-namespace <NAMESPACE> |
The namespace to use for the generated DbContext class. Note: overrides --namespace . |
|
--force |
-f |
Overwrite existing files. |
--output-dir <PATH> |
-o |
The directory to put entity class files in. Paths are relative to the project directory. |
--namespace <NAMESPACE> |
-n |
The namespace to use for all generated classes. Defaults to generated from the root namespace and the output directory. |
--schema <SCHEMA_NAME>... |
The schemas of tables and views to generate entity types for. To specify multiple schemas, repeat --schema for each one. If this option is omitted, all schemas are included. If this option is used, then all tables and views in the schemas will be included in the model, even if they are not explicitly included using --table. |
|
--table <TABLE_NAME>... |
-t |
The tables and views to generate entity types for. To specify multiple tables, repeat -t or --table for each one. Tables or views in a specific schema can be included using the 'schema.table' or 'schema.view' format. If this option is omitted, all tables and views are included. |
--use-database-names |
Use table, view, sequence, and column names exactly as they appear in the database. If this option is omitted, database names are changed to more closely conform to C# name style conventions. | |
--no-onconfiguring |
Suppresses generation of the OnConfiguring method in the generated DbContext class. |
|
--no-pluralize |
Don't use the pluralizer. |
The common options are listed above.
The following example scaffolds all schemas and tables and puts the new files in the Models folder.
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models
The following example scaffolds only selected tables and creates the context in a separate folder with a specified name and namespace:
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models -t Blog -t Post --context-dir Context -c BlogContext --context-namespace New.Namespace
The following example reads the connection string from the project's configuration set using the Secret Manager tool.
dotnet user-secrets set ConnectionStrings:Blogging "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Blogging"
dotnet ef dbcontext scaffold Name=ConnectionStrings:Blogging Microsoft.EntityFrameworkCore.SqlServer
The following example skips scaffolding an OnConfiguring
method. This can be useful when you want to configure the DbContext outside of the class. For example, ASP.NET Core apps typically configure it in Startup.ConfigureServices.
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;User Id=myUsername;Password=myPassword;" Microsoft.EntityFrameworkCore.SqlServer --no-onconfiguring
dotnet ef dbcontext script
Generates a SQL script from the DbContext. Bypasses any migrations.
Options:
Option | Short | Description |
---|---|---|
--output <FILE> |
-o |
The file to write the result to. |
The common options are listed above.
dotnet ef migrations add
Adds a new migration.
Arguments:
Argument | Description |
---|---|
<NAME> |
The name of the migration. |
Options:
Option | Short | Description |
---|---|---|
--output-dir <PATH> |
-o |
The directory use to output the files. Paths are relative to the target project directory. Defaults to "Migrations". |
--namespace <NAMESPACE> |
-n |
The namespace to use for the generated classes. Defaults to generated from the output directory. |
The common options are listed above.
dotnet ef migrations bundle
Creates an executable to update the database.
Options:
Option | Short | Description |
---|---|---|
--output <FILE> |
-o |
The path of executable file to create. |
--force |
-f |
Overwrite existing files. |
--self-contained |
Also bundle the .NET runtime so it doesn't need to be installed on the machine. | |
--target-runtime <RUNTIME_IDENTIFIER> |
-r |
The target runtime to bundle for. |
The common options are listed above.
dotnet ef migrations has-pending-model-changes
Note
This command was added in EF Core 8.0.
Checks if any changes have been made to the model since the last migration.
Options:
The common options are listed above.
dotnet ef migrations list
Lists available migrations.
Options:
Option | Description |
---|---|
--connection <CONNECTION> |
The connection string to the database. Defaults to the one specified in AddDbContext or OnConfiguring. |
--no-connect |
Don't connect to the database. |
The common options are listed above.
dotnet ef migrations remove
Removes the last migration, rolling back the code changes that were done for the latest migration.
Options:
Option | Short | Description |
---|---|---|
--force |
-f |
Revert the latest migration, rolling back both code and database changes that were done for the latest migration. Continues to roll back only the code changes if an error occurs while connecting to the database. |
The common options are listed above.
dotnet ef migrations script
Generates a SQL script from migrations.
Arguments:
Argument | Description |
---|---|
<FROM> |
The starting migration. Migrations may be identified by name or by ID. The number 0 is a special case that means before the first migration. Defaults to 0. |
<TO> |
The ending migration. Defaults to the last migration. |
Options:
Option | Short | Description |
---|---|---|
--output <FILE> |
-o |
The file to write the script to. |
--idempotent |
-i |
Generate a script that can be used on a database at any migration. |
--no-transactions |
Don't generate SQL transaction statements. |
The common options are listed above.
The following example creates a script for the InitialCreate migration:
dotnet ef migrations script 0 InitialCreate
The following example creates a script for all migrations after the InitialCreate migration.
dotnet ef migrations script 20180904195021_InitialCreate