Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ı
--namespace
kullanarak 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 Name
FullName
olarak 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: true
migrationBuilder.Sql
geç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.
- Bir sorun olması durumunda veritabanınızı yedekleyin.
- Veritabanınızda geçiş geçmişi tablosundaki tüm satırları silin (örneğin, SQL Server'da
DELETE FROM [__EFMigrationsHistory]
). - 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 özel geçiş kodu 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 fazlası 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 fazlası için komutlar içerir.