Compartir a través de


Servicios en tiempo de diseño

Algunos servicios usados por las herramientas solo se utilizan en la fase 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á transitivamente 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="9.0.0">
  <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 de tiempo de diseño.

Service Description
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.
ICSharpMigrationOperationGenerator Genera código de C# para las operaciones de migración.
ICSharpSnapshotGenerator Genera código de C# para instantáneas de modelo.
IMigrationsCodeGenerator Genera código para una migración.
IMigrationsCodeGeneratorSelector Selecciona el generador de código de migraciones adecuado.
IMigrationsScaffolder Clase principal para administrar archivos de migración.
ICompiledModelCodeGenerator Genera código para los metadatos del modelo compilado.
ICompiledModelCodeGeneratorSelector Selecciona el generador de código de modelo compilado adecuado.
ICompiledModelScaffolder La clase principal para los modelos compilados de scaffolding.
IDatabaseModelFactory Crea un modelo de base de datos a partir de una base de datos.
IModelCodeGenerator Genera código para un modelo.
IModelCodeGeneratorSelector Selecciona el generador de código de modelo adecuado.
IProviderConfigurationCodeGenerator Genera código OnConfiguring.
IReverseEngineerScaffolder La clase principal para aplicar el andamiaje a modelos generados mediante ingeniería inversa.
IScaffoldingModelFactory Crea un modelo a partir de un modelo de base de datos.
IPrecompiledQueryCodeGenerator Genera código para consultas precompiladas.
IPrecompiledQueryCodeGeneratorSelector Selecciona el generador de código de consulta precompilado adecuado.

Uso de 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 crear un proveedor de servicios que contenga estos servicios mediante los métodos de extensión AddEntityFrameworkDesignTimeServices y AddDbContextDesignTimeServices.

using var db = new MyDbContext();

// Create design-time services
var serviceCollection = new ServiceCollection();
serviceCollection.AddDbContextDesignTimeServices(db);

var provider = db.GetService<IDatabaseProvider>().Name;
var providerAssembly = Assembly.Load(new AssemblyName(provider));
var providerServicesAttribute = providerAssembly.GetCustomAttribute<DesignTimeProviderServicesAttribute>();
var designTimeServicesType = providerAssembly.GetType(providerServicesAttribute.TypeName, throwOnError: true);
((IDesignTimeServices)Activator.CreateInstance(designTimeServicesType)!).ConfigureDesignTimeServices(serviceCollection);

serviceCollection.AddEntityFrameworkDesignTimeServices();

var serviceProvider = serviceCollection.BuildServiceProvider();

// Add a migration
var migrationsScaffolder = serviceProvider.GetRequiredService<IMigrationsScaffolder>();
var migration = migrationsScaffolder.ScaffoldMigration(migrationName, rootNamespace);
migrationsScaffolder.Save(projectDir, migration, outputDir);