Aracılığıyla paylaş


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.

Tavsiye

DbContext başlangıç projesinden farklı bir derlemedeyse, hedef ve başlangıç projelerini Paket Yöneticisi Konsol araçları veya .NET Core CLI araçları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 Blog varlığınızda yeni bir CreatedTimestamp özellikse, AddBlogCreatedTimestamp gibi bir ad seçebilirsiniz.

projenize Migrations dizini altında üç dosya eklenir:

  • XXXXXXXXXXXXXX_AddBlogCreatedTimestamp.cs--Ana göç dosyası. Geçişi uygulamak (Up) ve geri döndürmek için gereken işlemleri içerir (Down).
  • XXXXXXXXXXXXXX_AddBlogCreatedTimestamp.Designer.cs--Göçler için 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.

Namespace'ler

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

Uyarı

--namespacekullanarak ad alanını dizinden bağımsız olarak da 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ırmaları

Geçişleri özelleştirmenin gerekli olduğu dikkate değer bir örnek, bir özelliği yeniden adlandırmaktır. Örneğin, bir özelliği NameFullNameolarak yeniden 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ş as-isuygulanı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");

Tavsiye

Geçiş düzenlemesi, bir işlemin veri kaybına yol açabileceği durumlarda (örneğin sütun bırakma gibi) uyarı verir. 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, yerleşik bir API aracılığıyla gerçekleştirilebilir, ancak birçok durumda bu mümkün değildir. Örneğin, mevcut FirstName ve LastName özelliklerini tek, yeni bir FullName özelliğiyle 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;')");

Tavsiye

EXEC, sql toplu işleminde bir deyimin ilk veya tek olması gerektiğinde kullanılır. Ayrıca, referans verilen sütunlar bir tabloda mevcut olmadığında ortaya çıkabilecek idempotent geçiş betiklerindeki ayrıştırıcı hatalarına çö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:

  • Saklanan prosedürler
  • Tam Metin Arama
  • İşlevler
  • Tetikleyiciler
  • Görüşler

Ç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, suppressTransaction: truemigrationBuilder.Sqlgeçirerek işlemden çıkabilirsiniz.

Bir geçişi kaldır

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 kontrol etme

Uyarı

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 bir geçiş eklemeyi unuttuğunuzda bunu bilmenize yardımcı olabilir. Bunu yapmak için bu komutu kullanmak gerekir.

dotnet ef migrations has-pending-model-changes

Bu denetimi context.Database.HasPendingModelChanges()kullanarak program aracılığıyla 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, Migrations klasörünüzü silerek ve 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ı elle yapılan işler 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, SQL Server'da DELETE FROM [__EFMigrationsHistory]).
  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 özel geçiş kodu kaybolur. Tüm özelleştirmelerin korunması için yeni ilk geçişe el ile uygulanması gerekir.

Ek kaynaklar