Design-time services
Some services used by the tools are only used at design time. These services are managed separately from EF Core's runtime services to prevent them from being deployed with your app. To override one of these services (for example the service to generate migration files), add an implementation of IDesignTimeServices
to your startup project.
internal class MyDesignTimeServices : IDesignTimeServices
{
public void ConfigureDesignTimeServices(IServiceCollection services)
=> services.AddSingleton<IMigrationsCodeGenerator, MyMigrationsCodeGenerator>();
}
Referencing Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Design is a DevelopmentDependency package. This means that the dependency won't flow transitively into other projects, and that you cannot, by default, reference its types.
In order to reference its types and override design-time services, update the PackageReference item's metadata in your project file.
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.9">
<PrivateAssets>all</PrivateAssets>
<!-- Remove IncludeAssets to allow compiling against the assembly -->
<!--<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>-->
</PackageReference>
If the package is being referenced transitively via Microsoft.EntityFrameworkCore.Tools, you will need to add an explicit PackageReference to the package and change its metadata.
List of services
The following is a list of the design-time services.
Service | Description |
---|---|
IAnnotationCodeGenerator | Generates the code for corresponding model annotations. |
ICSharpHelper | Helps with generating C# code. |
IPluralizer | Pluralizes and singularizes words. |
IMigrationsCodeGenerator | Generates code for a migration. |
IMigrationsScaffolder | The main class for managing migration files. |
IDatabaseModelFactory | Creates a database model from a database. |
IModelCodeGenerator | Generates code for a model. |
IProviderConfigurationCodeGenerator | Generates OnConfiguring code. |
IReverseEngineerScaffolder | The main class for scaffolding reverse engineered models. |
IScaffoldingModelFactory | Creates a model from a database model. |
Using services
These services can also be useful for creating your own tools. For example, when you want to automate part of you design-time workflow.
You can build a service provider containing these services using the AddEntityFrameworkDesignTimeServices and AddDbContextDesignTimeServices extension methods.
var db = new MyDbContext();
// Create design-time services
var serviceCollection = new ServiceCollection();
serviceCollection.AddEntityFrameworkDesignTimeServices();
serviceCollection.AddDbContextDesignTimeServices(db);
var serviceProvider = serviceCollection.BuildServiceProvider();
// Add a migration
var migrationsScaffolder = serviceProvider.GetService<IMigrationsScaffolder>();
var migration = migrationsScaffolder.ScaffoldMigration(migrationName, rootNamespace);
migrationsScaffolder.Save(projectDir, migration, outputDir);