Geçişleri Yönetme

Modeliniz değiştikçe, geçişler normal geliştirmenin bir parçası olarak eklenir ve kaldırılır ve geçiş dosyaları projenizin kaynak denetimine iade edilir. Geçişleri yönetmek için önce EF Core komut satırı araçlarını yüklemeniz gerekir.

Bahşiş

DbContext başlangıç projesinden farklı bir derlemedeyse, hedef ve başlangıç projelerini Paket Yöneticisi Konsolu araçlarında veya .NET Core CLI araçlarında açıkça belirtebilirsiniz.

Geçiş ekleme

Modeliniz değiştirildikten sonra, bu değişiklik için bir geçiş ekleyebilirsiniz:

dotnet ef migrations add AddBlogCreatedTimestamp

Geçiş adı, sürüm denetim sistemindeki bir işleme iletisi gibi kullanılabilir. Örneğin, değişiklik varlığınızda yeni CreatedTimestamp bir özellikse AddBlogCreatedTimestamp gibi bir ad seçebilirsinizBlog.

Projenize Migrations dizini altında üç dosya eklenir:

  • XXXXXXXXXXXXXX_AddCreatedTimestamp.cs--Ana geçiş dosyası. Geçişi uygulamak (içinde Up) ve geri döndürmek için gerekli işlemleri (içinde Down) içerir.
  • XXXXXXXXXXXXXX_AddCreatedTimestamp. Tasarım Aracı.cs--Geçişler meta veri dosyası. EF tarafından kullanılan bilgileri içerir.
  • MyContextModelSnapshot.cs--Geçerli modelinizin anlık görüntüsü. Sonraki geçiş eklenirken nelerin değiştiğini belirlemek için kullanılır.

Dosya adındaki zaman damgası, değişikliklerin ilerleme durumunu görebilmeniz için bunların kronolojik olarak sıralı tutulmasına yardımcı olur.

Ad Alanları

Migrations dosyalarını taşıyabilir ve ad alanlarını el ile değiştirebilirsiniz. Yeni geçişler, son geçişin eşdüzeyleri olarak oluşturulur. Alternatif olarak, dizini oluşturma zamanında aşağıdaki gibi belirtebilirsiniz:

dotnet ef migrations add InitialCreate --output-dir Your/Directory

Dekont

Ayrıca kullanarak --namespacead alanını dizinden bağımsız olarak değiştirebilirsiniz.

Geçiş kodunu özelleştirme

EF Core genel olarak doğru geçişler oluştururken, kodu her zaman gözden geçirmeli ve istenen değişikliğe karşılık olduğundan emin olmalısınız; bazı durumlarda, bunu yapmak bile gereklidir.

Sütun yeniden adlandırır

Geçişleri özelleştirmenin gerekli olduğu önemli bir örnek, bir özelliği yeniden adlandırmaktır. Örneğin, bir özelliği olarak Name FullNameyeniden adlandırırsanız EF Core aşağıdaki geçişi oluşturur:

migrationBuilder.DropColumn(
    name: "Name",
    table: "Customers");

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customers",
    nullable: true);

EF Core genellikle amacın ne zaman bir sütun bırakıp yeni bir sütun (iki ayrı değişiklik) oluşturmak olduğunu ve bir sütunun ne zaman yeniden adlandırılması gerektiğini bilemez. Yukarıdaki geçiş olduğu gibi uygulanırsa, tüm müşteri adlarınız kaybolur. Bir sütunu yeniden adlandırmak için yukarıdaki oluşturulan geçişi aşağıdakilerle değiştirin:

migrationBuilder.RenameColumn(
    name: "Name",
    table: "Customers",
    newName: "FullName");

Bahşiş

Geçiş iskelesi işlemi, bir işlemin veri kaybına (sütun bırakma gibi) neden olabileceği durumlarda uyarır. Bu uyarıyı görürseniz, geçiş kodunu doğruluk açısından gözden geçirmeyi unutmayın.

Ham SQL ekleme

Bir sütunu yeniden adlandırma işlemi, çoğu durumda mümkün olmayan yerleşik bir API aracılığıyla elde edilebilir. Örneğin, mevcut FirstName ve LastName özelliklerini tek, yeni FullName bir özellikle değiştirmek isteyebiliriz. EF Core tarafından oluşturulan geçiş aşağıdaki gibi olacaktır:

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);

Daha önce olduğu gibi, bu istenmeyen veri kaybına neden olabilir. Eski sütunlardan verileri aktarmak için geçişleri yeniden düzenler ve aşağıdaki gibi bir ham SQL işlemi uygularız:

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);

migrationBuilder.Sql(
@"
    UPDATE Customer
    SET FullName = FirstName + ' ' + LastName;
");

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

Ham SQL aracılığıyla rastgele değişiklikler

Ham SQL, EF Core'un farkında olmadığı veritabanı nesnelerini yönetmek için de kullanılabilir. Bunu yapmak için herhangi bir model değişikliği yapmadan geçiş ekleyin; Boş bir geçiş oluşturulur ve bunu ham SQL işlemleriyle doldurabilirsiniz.

Örneğin, aşağıdaki geçiş bir SQL Server saklı yordamı oluşturur:

migrationBuilder.Sql(
@"
    EXEC ('CREATE PROCEDURE getFullName
        @LastName nvarchar(50),
        @FirstName nvarchar(50)
    AS
        RETURN @LastName + @FirstName;')");

Bahşiş

EXEC , sql toplu işleminde bir deyimin ilk veya tek bir deyim olması gerektiğinde kullanılır. Ayrıca, başvuruda bulunılan sütunlar şu anda bir tabloda mevcut olmadığında ortaya çıkabilecek bir kez etkili geçiş betiklerindeki ayrıştırıcı hatalarına geçici bir çözüm bulmak için de kullanılabilir.

Bu, aşağıdakiler dahil olmak üzere veritabanınızın herhangi bir yönünü yönetmek için kullanılabilir:

  • Saklı yordamlar
  • Tam Metin Araması
  • İşlevler
  • Tetikleyiciler
  • Görünümler

Çoğu durumda EF Core, geçişleri uygularken her geçişi otomatik olarak kendi işlemine sarmalar. Ne yazık ki, bazı geçiş işlemleri bazı veritabanlarında bir işlem içinde gerçekleştirilemez; bu durumlarda adresine geçirerek suppressTransaction: true migrationBuilder.Sqlişlemden çıkabilirsiniz.

Geçişi kaldırma

Bazen bir geçiş ekler ve EF Core modelinizi uygulamadan önce ek değişiklikler yapmanız gerektiğini fark edebilirsiniz. Son geçişi kaldırmak için bu komutu kullanın.

dotnet ef migrations remove

Geçişi kaldırdıktan sonra ek model değişiklikleri yapabilir ve yeniden ekleyebilirsiniz.

Uyarı

Üretim veritabanlarına zaten uygulanmış olan geçişleri kaldırmaktan kaçının. Bunun yapılması, bu geçişleri veritabanlarından geri döndüremeyeceğiniz ve sonraki geçişler tarafından yapılan varsayımları bozabileceğiniz anlamına gelir.

Geçişleri listeleme

Mevcut tüm geçişleri aşağıdaki gibi listeleyebilirsiniz:

dotnet ef migrations list

Bekleyen model değişikliklerini denetleme

Dekont

Bu özellik EF Core 8.0'a eklendi.

Bazen son geçişten sonra model değişiklikleri yapılıp yapılmadığını denetlemek isteyebilirsiniz. Bu, siz veya ekip arkadaşınız geçiş eklemeyi unuttuğunuzda size yardımcı olabilir. Bunu yapmak için bu komutu kullanmak gerekir.

dotnet ef migrations has-pending-model-changes

Bu denetimi kullanarak program aracılığıyla context.Database.HasPendingModelChanges()da gerçekleştirebilirsiniz. Bu, geçiş eklemeyi unuttuğunuzda başarısız olan bir birim testi yazmak için kullanılabilir.

Tüm geçişleri sıfırlama

Bazı aşırı durumlarda, tüm geçişleri kaldırmak ve baştan başlamak gerekebilir. Bu işlem, Migrations klasörünüzü silip veritabanınızı bırakarak kolayca yapılabilir; bu noktada, geçerli şemanızın tamamını içerecek yeni bir ilk geçiş oluşturabilirsiniz.

Ayrıca verilerinizi kaybetmeden tüm geçişleri sıfırlayabilir ve tek bir geçiş oluşturabilirsiniz. Buna bazen "sıkıştırma" denir ve bazı el ile çalışma gerektirir:

  1. Bir sorun olması durumunda veritabanınızı yedekleyin.
  2. Veritabanınızda geçiş geçmişi tablosundaki tüm satırları silin (örneğin DELETE FROM [__EFMigrationsHistory] , SQL Server'da).
  3. Migrations klasörünüzü silin.
  4. Yeni bir geçiş oluşturun ve bunun için bir SQL betiği oluşturun (dotnet ef migrations script).
  5. Tablolarınız zaten orada olduğundan, ilk geçişin zaten uygulandığını kaydetmek için geçiş geçmişine tek bir satır ekleyin. SQL ekleme, yukarıda oluşturulan SQL betiğindeki son işlemdir ve aşağıdakine benzer (değerleri güncelleştirmeyi unutmayın):
INSERT INTO [__EFMigrationsHistory] ([MIGRATIONID], [PRODUCTVERSION])
VALUES (N'<full_migration_timestamp_and_name>', N'<EF_version>');

Uyarı

Migrations klasörü silindiğinde tüm özel geçiş kodları kaybolur. Tüm özelleştirmelerin korunması için yeni ilk geçişe el ile uygulanması gerekir.

Ek kaynaklar