Servicios en tiempo de diseño

Algunos servicios usados por las herramientas solo se usan en tiempo de diseño. Estos servicios se administran por separado EF Core los servicios en tiempo de ejecución de la aplicación para evitar que se implementen con la aplicación. Para invalidar uno de estos servicios (por ejemplo, el servicio para generar archivos de migración), agregue una implementación de IDesignTimeServices al proyecto de inicio.

internal class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection services)
        => services.AddSingleton<IMigrationsCodeGenerator, MyMigrationsCodeGenerator>();
}

Referencia a Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design es un paquete DevelopmentDependency. Esto significa que la dependencia no fluirá transitivamente a otros proyectos y que, de forma predeterminada, no se puede hacer referencia a sus tipos.

Para hacer referencia a sus tipos e invalidar los servicios en tiempo de diseño, actualice los metadatos del elemento PackageReference en el archivo de proyecto.

<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>

Si se hace referencia al paquete de forma transitiva a través de Microsoft.EntityFrameworkCore.Tools, deberá agregar una packageReference explícita al paquete y cambiar sus metadatos.

Lista de servicios

A continuación se muestra una lista de los servicios en tiempo de diseño.

Servicio Descripción
IAnnotationCodeGenerator Genera el código para las anotaciones de modelo correspondientes.
ICSharpHelper Ayuda a generar código de C#.
IPluralizer Pluraliza y singulariza palabras.
IMigrationsCodeGenerator Genera código para una migración.
IMigrationsScaffolder Clase principal para administrar archivos de migración.
IDatabaseModelFactory Crea un modelo de base de datos a partir de una base de datos.
IModelCodeGenerator Genera código para un modelo.
IProviderConfigurationCodeGenerator Genera código OnConfiguring.
IReverseEngineerScaffolder Clase principal para los modelos de ingeniería inversa de scaffolding.
IScaffoldingModelFactory Crea un modelo a partir de un modelo de base de datos. Se ha agregado EF Core 6.0.

Usar servicios

Estos servicios también pueden ser útiles para crear sus propias herramientas. Por ejemplo, cuando desea automatizar parte del flujo de trabajo en tiempo de diseño.

Puede compilar un proveedor de servicios que contenga estos servicios mediante los métodos de extensión AddEntityFrameworkDesignTimeServices y AddDbContextDesignTimeServices.

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);