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 de los servicios en tiempo de ejecución de EF Core 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 a su proyecto de inicio.

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

Hacer referencia a Microsoft.EntityFrameworkCore.Design

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

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 manera transitiva a través de Microsoft.EntityFrameworkCore.Tools, tendrá que agregar una PackageReference explícita al paquete para 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 con la generación de 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 La clase principal para aplicar scaffolding a modelos de ingeniería inversa.
IScaffoldingModelFactory Crea un modelo a partir de un modelo de base de datos.

Uso de servicios

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

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