EF Taşıma İşlemleri: En son uygulanan taşıma işlemi geri alındı?


435

Bu gerçekten yaygın bir görev gibi görünüyor, ancak bunu yapmanın kolay bir yolunu bulamıyorum.

Son uygulanan geçişi geri almak istiyorum. Basit bir komut beklerdim,

PM> Update-Database -TargetMigration:"-1"

Bunun yerine, gelebileceğim tek şey:

PM> Get-Migrations

Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

(En azından sadece adı kullanabilir, zaman damgasını atlayabilirim ...)

Daha kolay bir yol var mı?


1
Üzgünüm, burada yıllar geçtik ve aslında kimse soruyu okumuyor.
Daniel ZA

Yanıtlar:


160

EF 5.0 itibariyle tarif ettiğiniz yaklaşım tercih edilen yöntemdir. Yani

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

veya örnek taşıma işlemlerinizi kullanma

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

Bir çözüm, yukarıdaki adımları otomatikleştiren bir sarıcı PS komut dosyası oluşturmak olacaktır. Ayrıca, bunun için bir özellik isteği oluşturmaktan çekinmeyin veya daha da iyisi, bunu uygulamak için bir deneme yapın! https://github.com/dotnet/ef6


4
Başka bir ayrıntı: Mevcut bir Manuel Geçişiniz varsa, geri dönmeniz gerekiyor, ancak "Aşağı" yönteminizin işleri gerçekten düzgün bir şekilde geri almadığını fark ederseniz, yalnızca düzenleyebilir ve kaydedebilir, ardından update-database -target'i yeniden çalıştırabilirsiniz. düzgün şekilde geri dönünceye kadar. Manuel Geçişi, daha önce uyguladıktan sonra - düzenlemeden izin verilmeyen bir şeye dönüştürmez.
Chris Moschini

1
Bu benim için işe yaramıyor. Tek aldığım "belirtilen hedef geçiş" -1 "mevcut değil
tutiplain

2
@tutiplain İkinci kod bloğuna bakın. Ne istediğini söylüyorsunuz, var olanı değil.
Sinjai

dotnet komutunu kullanarak bunu yapmanın doğru yolu nedir? Üzgünüm belgelerde bulamadım ya da bir şey eksik. Herhangi bir öneri entityframeworktutorial.net/efcore/… ile denediniz mi?
Sijan Shrestha

Çözümü buldum dotnet ef database update LastGoodMigration, ancak bu bir düğüm arka planından geliyor ve knex kullanarak sequlize gibi kafa karıştırıcı görünüyor, son değişikliği geri almak için bir komut var, veritabanına uygulanan son eylemi geri almak için herhangi bir komut var mı ?
Sijan Shrestha

415

Bu konuya biraz açıklama eklemek istiyorum:

Update-Database -TargetMigration:"name_of_migration"

Yukarıda yaptığınız şey, belirtilen taşıma işlemiyle bırakılıncaya kadar tüm geçişleri geri almak istediğinizi söylüyor. Böylece, GET-MIGRATIONS kullanırsanız ve A, B, C, D ve E'ye sahip olduğunuzu görürseniz, bu komutu kullanmanız sizi C'ye götürmek için E ve D'yi geri alır:

Update-Database -TargetMigration:"C"

Ayrıca, herkes aksine yorum yapamaz sürece, bir ordinal değeri ve kısa -Target anahtarı (böylece, -Target -TargetMigration aynıdır) kullanabilirsiniz fark ettim. Tüm taşıma işlemlerini geri almak ve baştan başlamak istiyorsanız, şunları kullanabilirsiniz:

Update-Database -Target:0

Yukarıdaki 0, İLK geçişi bile geri alır ( bu yıkıcı bir komuttur - kullanmadan önce ne yaptığınızı bildiğinizden emin olun! ) - yukarıdaki sözdizimini kullanırsanız yapamayacağınız bir şey hedef geçiş (bir geçiş uygulanmadan önce 0. geçişin adı mevcut değil!). Bu durumda, 0 (sıralı) değerini kullanmanız gerekir. Benzer şekilde, A, B, C, D ve E geçişlerini (bu sırayla) uyguladıysanız, sıra 1, A'ya, sıra 2, B'ye vb. Başvurmalıdır. B'ye geri dönmek için aşağıdakilerden birini kullanabilirsiniz:

Update-Database -TargetMigration:"B"

veya

Update-Database -TargetMigration:2

Ekim 2019'u düzenle:

Benzer bir soruya ilişkin bu cevaba göre -TargetEF Core 1.1 için doğru komut EF Core 1.1 -Migrationiçindir.


27
0 dizini ile geçişin adı $InitialDatabase.
MEMark

1
Teşekkürler. $ LatestDatabase gibi diğer dizin konumlarına atıfta bulunmak için herhangi bir $ (isim) değeri var mı veya bunun gibi bir şey var mı?
Jazimov

Bilmiyorum. Basit googling ile hiç bir şey bulamadım. Belki EF kaynak koduna göz atmak onları ortaya çıkarabilir?
MEMark

3
FYI, sadece bununla karşılaştık ve OP ile aynı şeyi yapmak istiyorduk ... 0'ı tanımlayan bir PowerShell değişkeni ls variable:*gibi görünüyor $InitialDatabase, mevcut EF kaynak kodunda bile tanımlanan başka bir tane yok. Ve get-migrations hiçbir şey döndürmez, sadece konsola yazar, bu yüzden geri gönderilen nesneler üzerinde yineleme yapamazsınız ...
DrewJordan

1
Bu cevap olmalı
WtFudgE

76

In EntityFrameworkCore :

Update-Database 20161012160749_AddedOrderToCourse

Burada 20161012160749_AddedOrderToCoursegeri almak istediğiniz taşıma adıdır.


3
GEM! Bu cevabı bulmam biraz zaman aldı (.NET Core için değiştirdikleri için). Kesinlikle bir upvote değer!
HokeyJ

4
Tarih / saati eklemenize gerek yoktur. Sadece ismini koyabilirsiniz.
Richard Marskell - Drackir

1
Bu benim için işe yaramıyor ... "Bitti" diyecektir, ancak belirttiğimden sonraki tüm geçişler hala devam ediyor. Ve bu taşımaların hiçbirindeki "Down" kodunun hiçbiri yürütülmedi.
egmfrs 21:18

biri de aşağıdaki gibi belirli bir taşıma işlemine geri dönebilir: Update-Database -Migration: "AddedOrderToCourse" Özellikle geçiş adlarında boşluk kullanıldığında, bunu yapmanın yolu budur. (örneğin, Güncelleme-Veritabanı-Taşıma "Derse Sipariş Eklendi")
SwissCoder

13

Çözüm şudur:

Update-Database TargetMigration 201609261919239_yourLastMigrationSucess

10
Bu soruda zaten söyleniyor, asker bunu zaten biliyordu. Bunun nasıl yardımcı olduğunu görmüyorum, belki daha net yapabilirsin?
ANeves

bu cevap daha özlü. TY Maks.
andreikashin

4

Ek hatırlatma:

Birden fazla yapılandırma türünüz varsa, [YapılandırmaAdı]

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]

3

EF Çekirdeğinde Remove-Migration, hatalı taşıma işleminizi ekledikten sonra komutu paket yöneticisi konsoluna girebilirsiniz .

Konsol, taşımanız veri kaybı içeriyorsa bunu yapmanızı önerir:

Veri kaybına neden olabilecek bir işlem yapı iskelesi ile kapatıldı. Lütfen doğruluk için taşımayı inceleyin. Bu eylemi geri almak için Kaldır-Taşı seçeneğini kullanın.


3
update-database 0

Uyarı : Bu,EFC'de TÜM taşıma işlemlerinigerialacaktır! Lütfen dikkatli kullanın :)


2

Paket Yöneticisi Konsolu'nda çalıştırıldığında bunun çalıştığını gördüm:

dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }

Bunu kolaylaştıran bir komut dosyası oluşturabilirsiniz.


1

EntityFrameworkCore kullanıyorum ve @MaciejLisCK tarafından cevap kullanıyorum. Birden çok DB bağlamınız varsa, context parametresini ekleyerek bağlamı belirtmeniz gerekir.

Update-Database 201207211340509_MyMigration -context myDBcontext

( 201207211340509_MyMigrationgeri almak istediğiniz taşıma nerede ve myDBcontextDB içeriğinizin adıdır)



0

Eğer birlikte çalıştırmak sürece güncelleme veritabanı AutomaticMigrationDataLossAllowed beri komutu = varsayılan olarak false ve roolbacks eylem tamamlanmaz dataloss EF için olasılığı vardır -force parametresi.

Update-Database TargetMigration:"Your migration name" -force

veya

Update-Database TargetMigration:Your_Migration_Index -force
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.