具有多個提供者的移轉

EF Core Tools 只會針對使用中提供者進行 Scaffold 移轉。 不過,有時候,您可能想要搭配 DbCoNtext 使用一個以上的提供者(例如 Microsoft SQL Server 和 SQLite)。 藉由維護多個移轉集,為每個提供者維護一組移轉,並為每個模型變更新增移轉。

使用多個內容類型

建立多個移轉集的其中一種方式是針對每個提供者使用一個 DbCoNtext 類型。

class SqliteBlogContext : BlogContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite("Data Source=my.db");
}

新增移轉時指定內容類型。

dotnet ef migrations add InitialCreate --context BlogContext --output-dir Migrations/SqlServerMigrations
dotnet ef migrations add InitialCreate --context SqliteBlogContext --output-dir Migrations/SqliteMigrations

提示

您不需要指定後續移轉的輸出目錄,因為它們會建立為最後一個移轉的同層級。

使用一個內容類型

也可以使用一個 DbCoNtext 類型。 這目前需要將移轉移至不同的元件。 如需設定專案的指示,請參閱 使用個別移轉專案

提示

您可以檢視本文中的 GitHut 範例

您可以從工具將引數傳遞至應用程式。 這可以啟用更精簡的工作流程,避免在執行工具時手動變更專案。

以下是使用泛型主機 運作良好的模式。

public static IHostBuilder CreateHostBuilder(string[] args)
    => Host.CreateDefaultBuilder(args)
        .ConfigureServices(
            (hostContext, services) =>
            {
                services.AddHostedService<Worker>();

                // Set the active provider via configuration
                var configuration = hostContext.Configuration;
                var provider = configuration.GetValue("Provider", "SqlServer");

                services.AddDbContext<BlogContext>(
                    options => _ = provider switch
                    {
                        "Sqlite" => options.UseSqlite(
                            configuration.GetConnectionString("SqliteConnection"),
                            x => x.MigrationsAssembly("SqliteMigrations")),

                        "SqlServer" => options.UseSqlServer(
                            configuration.GetConnectionString("SqlServerConnection"),
                            x => x.MigrationsAssembly("SqlServerMigrations")),

                        _ => throw new Exception($"Unsupported provider: {provider}")
                    });
            });

由於預設主機產生器會從命令列引數讀取組態,因此您可以在執行工具時指定提供者。

dotnet ef migrations add MyMigration --project ../SqlServerMigrations -- --provider SqlServer
dotnet ef migrations add MyMigration --project ../SqliteMigrations -- --provider Sqlite

提示

權杖 -- 會指示 dotnet ef 將後續的所有專案視為引數,而不是嘗試將它們剖析為選項。 未使用 dotnet ef 的任何額外引數會轉送至應用程式。