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çindeDown
) 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 --namespace
ad 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
FullName
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ş 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.Sql
iş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:
- Bir sorun olması durumunda veritabanınızı yedekleyin.
- Veritabanınızda geçiş geçmişi tablosundaki tüm satırları silin (örneğin
DELETE FROM [__EFMigrationsHistory]
, SQL Server'da). - Migrations klasörünüzü silin.
- Yeni bir geçiş oluşturun ve bunun için bir SQL betiği oluşturun (
dotnet ef migrations script
). - 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
- Entity Framework Core araçları başvurusu - .NET Core CLI : Güncelleştirme, bırakma, ekleme, kaldırma ve daha fazla işlem için komutlar içerir.
- Entity Framework Core araçları başvurusu - Visual Studio'da Paket Yöneticisi Konsolu : Güncelleştirme, bırakma, ekleme, kaldırma ve daha fazla işlem için komutlar içerir.