Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Некоторые службы, используемые инструментами, используются только во время разработки. Эти службы управляются отдельно от служб среды выполнения 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);