Previous Connection Pooling and Performance Tuning EF-core-Migrations Next

EF Core Scaffold-DbContext Guide

Scaffold all entities from an existing database (EF Core)

You can create all entities from an existing database in Entity Framework Core (EF Core) using the Scaffold-DbContext / dotnet ef dbcontext scaffold command. This process is known as reverse engineering and generates a DbContext class and entity classes for each table based on your database schema.

Default behavior

By default, the scaffold command will scaffold all tables in the specified database, so there is no need to list them individually.

Prerequisites

Before you begin, install the necessary NuGet packages for EF Core tooling and your database provider.

Install design package

This package is required for the scaffolding tools:

dotnet add package Microsoft.EntityFrameworkCore.Design

Install database provider package

For a SQL Server database, for example:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

Scaffolding all tables (command line)

Run the dotnet ef dbcontext scaffold command from the project's root directory.

Command format

dotnet ef dbcontext scaffold "<Connection_String>" <Provider_Name> -o <Output_Directory>

Example for SQL Server

dotnet ef dbcontext scaffold "Server=(localdb)\\mssqllocaldb;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

Explanation of the command

  • dotnet ef dbcontext scaffold: Base command for reverse engineering a database schema.
  • "<Connection_String>": Connection string telling EF Core how to connect and read the schema.
  • Microsoft.EntityFrameworkCore.SqlServer: The database provider package name.
  • -o Models: Output directory where generated files will be placed (creates a Models folder).

Options for customization

You can customize scaffolding with these options:

  • --context <DbContext_Name>: Specify name for the generated DbContext class.
  • --data-annotations: Use data annotation attributes where possible instead of Fluent API.
  • --force: Overwrite existing DbContext and entity files (useful after schema changes).
  • --no-onconfiguring: Prevent EF Core from adding the connection string to the generated DbContext class.
  • --use-database-names: Disable automatic pluralization / C# name conversion (use database names as-is).

Example with common options

dotnet ef dbcontext scaffold "Server=(localdb)\\mssqllocaldb;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models --context SchoolDbContext --no-onconfiguring --force

Visual Studio (Package Manager Console)

If you prefer Visual Studio, run the scaffold command from the Package Manager Console (PMC).

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

Note: In PMC arguments use a single dash (-), while the .NET CLI uses double dash (--).

What gets generated

  • A DbContext file (e.g., SchoolDBContext.cs) with DbSet<T> properties for each table.
  • A separate C# file for each table (e.g., Student.cs, Course.cs) defining properties and relationships.
  • Configuration logic inside OnModelCreating in the DbContext, using the Fluent API to describe schema and relationships.

Optional: Scaffold Only Specific Tables

If you don’t want all tables, you can specify:

powershell
Scaffold-DbContext "Server=.;Database=YourDbName;Trusted_Connection=True;" 
Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables Products,Orders
    

✅ Best Practices

  • Use partial classes if you want to extend generated entities (so re-scaffolding won’t overwrite your changes).
  • Keep the DbContext in a separate folder (e.g., Data) and entities in Models.
  • Always use version control for migrations and scaffolded code.
  • If schema changes, re-run Scaffold-DbContext with -Force to regenerate.

⚠️ Precautions for EF Core Scaffold-DbContext

  • Backup Database: Always back up your database before applying changes or regenerating models.
  • Use Partial Classes: Extend generated entities with partial classes to avoid losing custom logic when re-scaffolding.
  • Be Careful with -Force: The -Force option overwrites existing files — ensure changes are version-controlled.
  • Secure Connection Strings: Do not hardcode sensitive connection strings in code; use secrets or environment variables.
  • Schema Changes: Re-scaffold after schema changes, but validate generated code before deploying.
  • Output Directory: Keep generated models in a dedicated folder (e.g., Models) to maintain clean architecture.
  • Context Placement: Place DbContext in a separate folder (e.g., Data) for better organization.
  • Check Naming Conventions: Use --use-database-names if you want to preserve exact table/column names.
  • Review Relationships: Validate navigation properties and relationships generated by EF Core.
  • Version Control: Commit scaffolded files to source control to track changes over time.
  • Performance: Remove unused entities or DbSets to avoid unnecessary overhead.
  • Security: Ensure generated models don’t expose sensitive columns unintentionally.

🎯 Summary

EF Core scaffolding is powerful for reverse engineering databases, but it must be used carefully. Always secure connection strings, use partial classes for custom logic, and validate generated code before deploying to production.

To create all entities from tables in EF Core Database First: 👉 Run Scaffold-DbContext (PMC) or dotnet ef dbcontext scaffold (CLI) with your connection string and provider. This will generate a DbContext and entity classes for all tables in your database.

Back to Index
Previous Connection Pooling and Performance Tuning EF-core-Migrations Next
*