迁移多个提供程序Migrations with Multiple Providers

EF Core 工具仅基架活动提供程序的迁移。 但有时,您可能想要将多个提供程序(例如 Microsoft SQL Server 和 SQLite)用于 DbContext。 可以通过两种方式来处理迁移。 您可以维护两组迁移-每个提供程序一个,或将它们合并到可以同时使用的单个集。

两个迁移集Two migration sets

第一种方法是为每个模型更改生成两个迁移。

实现此目的的一种方法是将每个迁移集放在单独的程序集中,并在添加两个迁移之间手动切换活动提供程序(和迁移程序集)。

更轻松地使用工具的另一种方法是创建一个从 DbContext 派生的新类型并重写活动提供程序。 此类型在设计时用于添加或应用迁移。

  1. class MySqliteDbContext : MyDbContext
  2. {
  3. protected override void OnConfiguring(DbContextOptionsBuilder options)
  4. => options.UseSqlite("Data Source=my.db");
  5. }

备注

由于每个迁移集使用自己的 DbContext 类型,因此此方法不需要使用单独的迁移程序集。

添加新迁移时,指定上下文类型。

  1. dotnet ef migrations add InitialCreate --context MyDbContext --output-dir Migrations/SqlServerMigrations
  2. dotnet ef migrations add InitialCreate --context MySqliteDbContext --output-dir Migrations/SqliteMigrations
  1. Add-Migration InitialCreate -Context MyDbContext -OutputDir Migrations\SqlServerMigrations
  2. Add-Migration InitialCreate -Context MySqliteDbContext -OutputDir Migrations\SqliteMigrations

提示

无需指定输出目录即可进行后续迁移,因为它们是以同级方式创建的。

一个迁移集One migration set

如果不喜欢两组迁移,可以手动将它们合并为可应用于这两个提供程序的单个集。

批注可以共存,因为提供程序会忽略它不理解的任何批注。 例如,使用 Microsoft SQL Server 和 SQLite 的主键列可能如下所示。

  1. Id = table.Column<int>(nullable: false)
  2. .Annotation("SqlServer:ValueGenerationStrategy",
  3. SqlServerValueGenerationStrategy.IdentityColumn)
  4. .Annotation("Sqlite:Autoincrement", true),

如果只能对一个提供程序应用操作,或它们在提供程序之间不同,请使用 ActiveProvider 属性来确定哪个提供程序处于活动状态:

  1. if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.SqlServer")
  2. {
  3. migrationBuilder.CreateSequence(
  4. name: "EntityFrameworkHiLoSequence");
  5. }