Migracje z wielu dostawcówMigrations with Multiple Providers

[EF Core Tools] 1 tylko tworzenia szkieletu migracje active dostawcy.The EF Core Tools only scaffold migrations for the active provider. Czasami jednak warto użyć więcej niż jednego dostawcę (na przykład Microsoft SQL Server i bazy danych SQLite) z Twojego DbContext.Sometimes, however, you may want to use more than one provider (for example Microsoft SQL Server and SQLite) with your DbContext. Istnieją dwa sposoby określają je za pomocą migracji.There are two ways to handle this with Migrations. Dwa zestawy można zachować na potrzeby migracji — jeden dla każdego dostawcy — lub scalania ich do jednego zestawu, który działa na obu.You can maintain two sets of migrations--one for each provider--or merge them into a single set that can work on both.

Dwa zestawy migracjiTwo migration sets

Pierwszym sposobem służy do generowania dwie migracje dla każdej zmiany modelu.In the first approach, you generate two migrations for each model change.

Jednym ze sposobów, aby zrobić to polega na umieszczeniu każdy zestaw migracji [w osobnym zestawie] 2 i ręcznie przełączać między dodawaniem dwie migracje active dostawcy (i zestawu migracji).One way to do this is to put each migration set in a separate assembly and manually switch the active provider (and migrations assembly) between adding the two migrations.

Jest innym podejściem, która ułatwia pracę z narzędziami do tworzenia nowego typu, który dziedziczy z typu DbContext i zastępuje active dostawcy.Another approach that makes working with the tools easier is to create a new type that derives from your DbContext and overrides the active provider. Ten typ jest używany w projekt czas podczas dodawania lub zastosowanie migracji.This type is used at design time when adding or applying migrations.

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

Uwaga

Ponieważ każdy zestaw migracji wykorzystuje swoje własne typy DbContext, to podejście nie wymaga użycia zestawu oddzielne migracje.Since each migration set uses its own DbContext types, this approach doesn't require using a separate migrations assembly.

Podczas dodawania nowej migracji, określić typy kontekstu.When adding new migration, specify the context types.

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

Porada

Nie potrzebujesz określić katalog wyjściowy dla następnej migracji, ponieważ są one tworzone jako elementy równorzędne do ostatni z nich.You don't need to specify the output directory for subsequent migrations since they are created as siblings to the last one.

Zestaw jedną migracjęOne migration set

Jeśli nie masz dwa zestawy na potrzeby migracji, należy ręcznie połączyć je w jeden zestaw, który można zastosować do obu dostawców.If you don't like having two sets of migrations, you can manually combine them into a single set that can be applied to both providers.

Adnotacje mogą współistnieć, ponieważ dostawca ignoruje wszelkie adnotacji, które go nie rozumie.Annotations can coexist since a provider ignores any annotations that it doesn't understand. Na przykład kolumna klucza podstawowego, który działa zarówno z programu Microsoft SQL Server i bazy danych SQLite może wyglądać następująco.For example, a primary key column that works with both Microsoft SQL Server and SQLite might look like this.

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

Jeśli operacje mogą być stosowane tylko dla jednego dostawcy (lub są one między dostawcami), użyj ActiveProvider właściwość, aby sprawdzić, który dostawca jest aktywny.If operations can only be applied on one provider (or they're differently between providers), use the ActiveProvider property to tell which provider is active.

if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.SqlServer")
{
    migrationBuilder.CreateSequence(
        name: "EntityFrameworkHiLoSequence");
}