Geçişleri Uygulama


Çalışma zamanında geçişleri uygulama

Genellikle başlatma sırasında uygulamanın geçişleri program aracılığıyla uygulaması mümkündür. Geçişlerin yerel geliştirme ve test aşamasında verimli bir şekilde çalışmalarına devam ederken, üretim veritabanlarını yönetmek için aşağıdaki nedenlerle bu yaklaşım uygun değildir:

  • Uygulamanın birden çok örneği çalışıyorsa, her iki uygulama da geçişi eşzamanlı olarak uygulamayı ve başarısız olabilir (veya daha da kötüsü veri bozulmasına neden olabilir).
  • Benzer şekilde, başka bir uygulama veritabanına erişirken başka bir uygulama veritabanına erişirken, bu ciddi sorunlara neden olabilir.
  • Uygulamanın veritabanı şemasını değiştirmek için yükseltilmiş erişimi olmalıdır. Genellikle uygulamanın üretimde veritabanı izinlerini sınırlamak iyi bir uygulamadır.
  • Bir sorun olması durumunda uygulanan geçişi geri almak önemlidir. Diğer stratejiler bunu kolayca ve kolayca sağlar.
  • SQL komutları, geliştiriciye bunları inceleme veya değiştirme şansı vermeden doğrudan program tarafından uygulanır. Bu, üretim ortamında tehlikeli olabilir.

Geçişleri program aracılığıyla uygulamak için çağrısında bulundu. context.Database.Migrate() Örneğin, tipik ASP.NET uygulama şunları gerçekleştirebilir:

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
        db.Database.Migrate();
    }

    host.Run();
}

Hizmetin Migrate() üzerine inşa edildiklerinin, IMigrator daha gelişmiş senaryolar için kullanıla bir yapıya sahip olduğunu unutmayın. Erişmek myDbContext.GetInfrastructure().GetService<IMigrator>() için kullanın.

Uyarı

  • Üretimde bu yaklaşımı kullanmadan önce dikkatli olun. Deneyim, bu dağıtım stratejisinin basitlığının oluşturduğu sorunların ağır basa basa olduğunu göstermiştir. Bunun yerine SQL betikleri oluşturmayı göz önünde bulundurabilirsiniz.
  • 'den önce EnsureCreated()Migrate() aramayın. EnsureCreated() şemayı oluşturmak için Geçişleri atlar ve bu da başarısız Migrate() olur.

Geçişleriniz eklendiktan sonra veritabanlarınıza dağıtılabilir ve uygulanmalıdır. Bunu yapmak için çeşitli stratejiler vardır ve bazıları üretim ortamları için daha uygun, diğerleri ise geliştirme yaşam döngüsü için daha uygundur.

Not

Dağıtım stratejiniz ne olursa olsun, oluşturulan geçişleri her zaman inceler ve bir üretim veritabanına uygulamadan önce bunları test et. Amaç yeniden adlandırmak olduğunda geçiş bir sütunu bırakabiliyor veya veritabanına uygulandığında çeşitli nedenlerle başarısız olabilir.

SQL betikleri

Geçişleri üretim veritabanına dağıtmanın önerilen yolu, dağıtım betikleri SQL etmektir. Bu stratejinin avantajları şunlardır:

  • SQL betikler doğruluk açısından gözden geçirilebildi; üretim veritabanlarına şema değişiklikleri uygulanması, veri kaybı olabilecek tehlikeli olabilecek bir işlem olduğu için bu önemlidir.
  • Bazı durumlarda betikler, üretim veritabanının belirli ihtiyaçlarına uyacak şekilde ayarlanmış olabilir.
  • SQL betikleri bir dağıtım teknolojisiyle birlikte kullanılabilir ve hatta CI işleminizin bir parçası olarak da üretebilirsiniz.
  • SQL betikleri bir DBA'ya sağlanmıştır ve ayrı olarak yönetilebilir ve arşivlenir.

Temel Kullanım

Aşağıda, boş bir veritabanından SQL en son geçişe kadar bir betik oluşturulur:

dotnet ef migrations script

Ile From (örtük için)

Aşağıda, verilen SQL en son geçişe kadar bir komut dosyası oluşturulur.

dotnet ef migrations script AddNewTables

From ve To ile

Aşağıda, belirtilen SQL geçişten bir komut from dosyası to oluşturulur.

dotnet ef migrations script AddNewTables AddAuditTable

Geri alma from betiği oluşturmak için to dosyasından daha yeni bir kullanabilirsiniz.

Uyarı

Olası veri kaybı senaryolarını not edin.

Betik oluşturma, hangi geçiş aralığının oluşturul gerektiğini belirtmek için aşağıdaki iki bağımsız değişkeni kabul eder:

  • Geçişten, betiği çalıştırmadan önce veritabanına uygulanan son geçiş olmalıdır. Hiçbir geçiş uygulanmadı ise belirtin 0 (bu varsayılan değerdir).
  • to geçişi, betiği çalıştırdikten sonra veritabanına uygulanacak son geçiştir. Bu varsayılan olarak projenizin son geçişini kullanır.

Her zaman aynı SQL betikleri

Yukarıda SQL betikler yalnızca şemanızı bir geçişten diğerine değiştirmek için uygulanabilir; betiği uygun şekilde ve yalnızca doğru geçiş durumuna sahip veritabanlarına uygulamak sizin sorumluluğuzdur. EF Core, hangi geçişlerin zaten uygulandığını dahili olarak kontrol etmek (geçiş geçmişi tablosu aracılığıyla) ve yalnızca eksik olanları uygulayan bir kez etkili betikler oluşturmayı da destekler. Bu, veritabanına uygulanan son geçişin ne olduğunu tam olarak bilmiyorsanız veya her biri farklı bir geçişte yer alan birden çok veritabanına dağıtıyorsanız yararlıdır.

Aşağıdakiler bir etkili geçişler üretir:

dotnet ef migrations script --idempotent

Komut satırı araçları

EF komut satırı araçları, bir veritabanına geçiş uygulamak için kullanılabilir. Geçişlerin yerel geliştirme ve test etme aşamasında verimli bir şekilde çalışmalarına devam ederken, bu yaklaşım üretim veritabanlarını yönetmek için ideal değildir:

  • SQL komutları, geliştiriciye bunları inceleme veya değiştirme şansı vermeden doğrudan araç tarafından uygulanır. Bu, üretim ortamında tehlikeli olabilir.
  • .NET SDK'sı ve EF aracı üretim sunucularında yüklü olmalı ve projenin kaynak kodunu gerektirir.

Aşağıdakiler veritabanınızı en son geçişe kadar günceller:

dotnet ef database update

Aşağıdakiler veritabanınızı verilen bir geçişe göre günceller:

dotnet ef database update AddNewTables

Bunun daha önceki bir geçişe geri dönmek için de kullanılal olduğunu unutmayın.

Uyarı

Olası veri kaybı senaryolarını not edin.

Geçişleri komut satırı araçları aracılığıyla uygulama hakkında daha fazla bilgi için bkz. EF Core araçları başvurusu.

Paketler

Not

Bu özellik, EF Core 6.0'da tanıtıldı.

Geçiş paketleri, bir veritabanına geçiş uygulamak için kullanılandan çok tek dosyalı yürütülebilir dosyalardır. Komut dosyası ve komut satırı araçlarının SQL bazı eksikliklerini ele almaktadır:

  • Betikleri SQL ek araçlar gerektirir.
  • Bu araçların işlem işleme ve hataya devam davranışı tutarsız ve bazen beklenmediktir. Bu, geçişleri uygularken bir hata oluşursa veritabanınızı tanımlanmamış durumda bırakır.
  • Paketler CI işleminizin bir parçası olarak oluşturulabilir ve daha sonra dağıtım sürecinizin bir parçası olarak kolayca yürütülebilir.
  • Paketler .NET SDK veya EF Aracı (hatta kendi içinde olduğunda .NET Çalışma Zamanı) yüklemeden yürütülebilirsiniz ve projenin kaynak kodunu gerektirmezler.

Aşağıda bir paket oluşturulur:

dotnet ef migrations bundle

Aşağıda Linux için kendi içinde bir paket oluşturulur:

dotnet ef migrations bundle --self-contained -r linux-x64

Paket oluşturma hakkında daha fazla bilgi için bkz. EF Core araçları başvurusu.

efbundle

Sonuçta elde edilen yürütülebilir dosya varsayılan efbundle olarak adlandırılmıştır. Veritabanını en son geçişe güncelleştirmek için kullanılabilir. veya çalıştırmaya dotnet ef database updateUpdate-Database eşdeğerdir.

Bağımsız değişken:

Bağımsız Değişken Description
<MIGRATION> Hedef geçiş. '0' ise tüm geçişler geri döndürülecek. Varsayılan olarak son geçiş kullanılır.

Seçenekler:

Seçenek Kısa Description
--connection <CONNECTION> Veritabanına bağlantı dizesi. Varsayılan değer AddDbContext veya OnConfiguring içinde belirtilen değerdir.
--verbose -v Ayrıntılı çıktıyı göster.
--no-color Çıkışı renklendirme.
--prefix-output Düzeye sahip ön ek çıkışı.

Aşağıdaki örnek, belirtilen kullanıcı adı ve parola SQL Server yerel bir örnek için geçişleri uygular.

.\efbundle.exe --connection 'Data Source=(local)\MSSQLSERVER;Initial Catalog=Blogging;User ID=myUsername;Password=myPassword'