Aracılığıyla paylaş


Tasarım zamanı hizmetleri

Araçlar tarafından kullanılan hizmetlerin bazıları yalnızca tasarım aşamasında kullanılır. Bu hizmetler, uygulamanızla dağıtılmalarını önlemek için EF Core'un çalışma zamanı hizmetlerinden ayrı olarak yönetilir. Bu hizmetlerden birini (örneğin, geçiş dosyalarının oluşturulacağı hizmet) geçersiz kılmak için başlangıç projenize uygulamasını IDesignTimeServices ekleyin.

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

Microsoft.EntityFrameworkCore.Design'e Başvuru Yapma

Microsoft.EntityFrameworkCore.Design bir DevelopmentDependency paketidir. Bu, bağımlılığın diğer projelere geçişli olarak akmayacağı ve varsayılan olarak türlerine başvuramayacağınız anlamına gelir.

Türlerine başvurmak ve tasarım zamanı hizmetlerini geçersiz kılmak için PackageReference öğesinin meta verilerini proje dosyanızda güncelleştirin.

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

Pakete Microsoft.EntityFrameworkCore.Tools aracılığıyla geçişli olarak başvuruluyorsa, pakete açık bir PackageReference eklemeniz ve meta verilerini değiştirmeniz gerekir.

Hizmetlerin listesi

Aşağıda tasarım zamanı hizmetlerinin listesi yer alır.

Hizmet Description
IAnnotationCodeGenerator İlgili model anotasyonları için kodu oluşturur.
ICSharpHelper C# kodu oluşturmaya yardımcı olur.
IPluralizer Sözcükleri çoğullaştırır ve tekilleştirir.
ICSharpMigrationOperationGenerator Geçiş işlemleri için C# kodu oluşturur.
ICSharpSnapshotGenerator Model anlık görüntüleri için C# kodu oluşturur.
IMigrationsCodeGenerator Geçiş için kod oluşturur.
IMigrationsCodeGeneratorSelector Uygun geçiş kodu oluşturucuyu seçer.
IMigrationsScaffolder Geçiş dosyalarını yönetmek için ana sınıf.
ICompiledModelCodeGenerator Derlenmiş model meta verileri için kod oluşturur.
ICompiledModelCodeGeneratorSelector Uygun derlenmiş model kod oluşturucuyu seçer.
ICompiledModelScaffolder Derlenmiş modeller için yapı iskelesi ana sınıfı.
IDatabaseModelFactory Veritabanından veritabanı modeli oluşturur.
IModelCodeGenerator Bir model için kod oluşturur.
IModelCodeGeneratorSelector Uygun model kod oluşturucuyu seçer.
IProviderConfigurationCodeGenerator OnConfiguring kodu oluşturur.
IReverseEngineerScaffolder Ters mühendislik uygulanmış modellerin iskelesi için ana sınıf.
IScaffoldingModelFactory Veritabanı modelinden model oluşturur.
IPrecompiledQueryCodeGenerator Önceden derlenmiş sorgular için kod oluşturur.
IPrecompiledQueryCodeGeneratorSelector Uygun önceden derlenmiş sorgu kodu oluşturucusunu seçer.

Hizmetleri kullanma

Bu hizmetler kendi araçlarınızı oluşturmak için de yararlı olabilir. Örneğin, tasarım zamanı iş akışınızın bir bölümünü otomatikleştirmek istediğinizde.

AddEntityFrameworkDesignTimeServices ve AddDbContextDesignTimeServices uzantı yöntemlerini kullanarak bu hizmetleri içeren bir hizmet sağlayıcısı oluşturabilirsiniz.

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