Birden çok sağlayıcı ile geçişlerMigrations with Multiple Providers

EF Core araçları , etkin sağlayıcı için yalnızca iskele geçişlerini.The EF Core Tools only scaffold migrations for the active provider. Ancak bazen, DbContext ile birden fazla sağlayıcı (örneğin Microsoft SQL Server ve SQLite) kullanmak isteyebilirsiniz.Sometimes, however, you may want to use more than one provider (for example Microsoft SQL Server and SQLite) with your DbContext. Geçişlerle bunu işlemenin iki yolu vardır.There are two ways to handle this with Migrations. Her bir sağlayıcı için bir tane olmak üzere iki geçiş kümesini koruyabilir veya bunları her ikisi üzerinde çalışan tek bir küme halinde birleştirebilirsiniz.You can maintain two sets of migrations--one for each provider--or merge them into a single set that can work on both.

İki geçiş kümesiTwo migration sets

İlk yaklaşımda, her model değişikliği için iki geçiş oluşturursunuz.In the first approach, you generate two migrations for each model change.

Bunu yapmanın bir yolu, her bir geçiş kümesini ayrı bir derlemede koymaktır ve iki geçiş ekleme arasında etkin sağlayıcıyı (ve geçişler derlemesini) el ile değiştirin.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.

Araçlarla çalışmayı kolaylaştıran başka bir yaklaşım da, DbContext 'ınızdan türeyen yeni bir tür oluşturmaktır ve etkin sağlayıcıyı geçersiz kılar.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. Bu tür, geçişler eklenirken veya uygulanırken tasarım zamanında kullanılır.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");
}

Not

Her geçiş kümesi kendi DbContext türlerini kullandığından, bu yaklaşım ayrı bir geçiş derlemesi kullanılmasını gerektirmez.Since each migration set uses its own DbContext types, this approach doesn't require using a separate migrations assembly.

Yeni geçiş eklerken bağlam türlerini belirtin.When adding new migration, specify the context types.

dotnet ef migrations add InitialCreate --context MyDbContext --output-dir Migrations/SqlServerMigrations
dotnet ef migrations add InitialCreate --context MySqliteDbContext --output-dir Migrations/SqliteMigrations

İpucu

Son bir için eşdüzey öğe olarak oluşturuldıklarından sonraki geçişler için çıkış dizinini belirtmeniz gerekmez.You don't need to specify the output directory for subsequent migrations since they are created as siblings to the last one.

Bir geçiş kümesiOne migration set

İki geçiş kümesi yoksa, bunları her iki sağlayıcıya da uygulanabilen tek bir küme halinde el ile birleştirebilirsiniz.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.

Sağlayıcı anladığı tüm ek açıklamaları yoksaydığından, ek açıklamalar birlikte kullanılabilir.Annotations can coexist since a provider ignores any annotations that it doesn't understand. Örneğin, hem Microsoft SQL Server hem de SQLite ile birlikte çalışarak birincil anahtar sütunu şöyle görünebilir.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),

İşlemler yalnızca bir sağlayıcı için uygulanabilirler veya sağlayıcılar arasında farklıysa, ActiveProvider hangi sağlayıcının etkin olduğunu anlamak için özelliğini kullanın:If operations can be applied only for one provider, or they're different between providers, use the ActiveProvider property to determine which provider is active:

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