具有多個提供者的移轉
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
的任何額外引數會轉送至應用程式。