Поделиться через


Службы времени разработки

Некоторые службы, используемые инструментами, используются только во время разработки. Эти службы управляются отдельно от служб среды выполнения EF Core, чтобы предотвратить их развертывание с помощью приложения. Чтобы переопределить одну из этих служб (например, службу для создания файлов миграции), добавьте реализацию IDesignTimeServices в проект запуска.

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

Ссылка на Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design — это пакет DevelopmentDependency. Это означает, что зависимость не будет передаваться транзитивно в другие проекты, и что по умолчанию нельзя ссылаться на его типы.

Чтобы обращаться к типам и переопределять службы во время разработки, обновите метаданные элемента PackageReference в файле проекта.

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

Если пакет ссылается транзитивно через Microsoft.EntityFrameworkCore.Tools, необходимо добавить явную ссылку PackageReference в пакет и изменить ее метаданные.

Перечень услуг

Ниже приведен список служб времени разработки.

Услуга Description
IAnnotationCodeGenerator Создает код для соответствующих аннотаций модели.
ICSharpHelper Помогает создавать код C#.
IPluralizer Плюрализация и сингуляризация слов.
ICSharpMigrationOperationGenerator Создает код C# для операций миграции.
ICSharpSnapshotGenerator Генерирует код C# для снимков состояния модели.
IMigrationsCodeGenerator Создает код для миграции.
IMigrationsCodeGeneratorSelector Выбирает соответствующий генератор кода миграции.
IMigrationsScaffolder Основной класс для управления файлами миграции.
ICompiledModelCodeGenerator Создает код для скомпилированных метаданных модели.
ICompiledModelCodeGeneratorSelector Выбирает соответствующий скомпилированный генератор кода модели.
ICompiledModelScaffolder Основной класс для создания каркаса скомпилированных моделей.
IDatabaseModelFactory Создает модель базы данных из базы данных.
IModelCodeGenerator Создает код для модели.
IModelCodeGeneratorSelector Выбирает соответствующий генератор кода модели.
IProviderConfigurationCodeGenerator Создает код для метода OnConfiguring.
IReverseEngineerScaffolder Основной класс для создания каркаса для моделей, полученных методом обратного проектирования.
IScaffoldingModelFactory Создает модель из модели базы данных.
IPrecompiledQueryCodeGenerator Создает код для предварительно скомпилированных запросов.
IPrecompiledQueryCodeGeneratorSelector Выбирает соответствующий генератор кода предварительно скомпилированных запросов.

Использование служб

Эти службы также могут быть полезны для создания ваших собственных инструментов. Например, если требуется автоматизировать часть рабочего процесса во время разработки.

Вы можете создать поставщик услуг, содержащий эти службы, с помощью методов расширения AddEntityFrameworkDesignTimeServices и 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);