303

Bu çok yaygın bir görev gibi görünüyor, ancak bunu yapmanın kolay bir yolunu bulamıyorum.EF Geçişler: Geri dönüş son uygulanan geçiş?

Son uygulanan geçişi geri almak istiyorum. Ben Yerine

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

gibi basit komutu beklerdik, ben ile gelip tümüdür:

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 ben damgası atlama, sadece adını kullanabilirsiniz ...)

Daha kolay bir yolu var mı?

cevap

112

EF 5.0'dan itibaren tarif ettiğiniz yaklaşım tercih edilen yoldur. Bir çözüm, yukarıdaki adımları otomatik hale getiren bir sarıcı PS komut dosyası oluşturmak olacaktır. Ayrıca, bunun için bir özellik talebi oluşturmaktan çekinmeyin, ya da daha iyisi, bunu uygulamak için bir çekim yapın! http://entityframework.codeplex.com/

+3

Başka bir ayrıntı: Mevcut bir Manuel Geçişiniz varsa, geri dönmeniz gerekir, ancak "Aşağı" yönteminizin işleri düzgün bir şekilde geri almıyorsa, bunu düzenleyebilir ve kaydedebilir, ardından güncelleme veritabanını yeniden çalıştırabilirsiniz - Hedef, düzgün bir şekilde geri dönene kadar. Manuel Göç'ü gerçeğe dönüştürdikten sonra - daha önce uyguladıktan sonra - değiştirilmesine izin verilmeyen bir şeye dönüştürmez. –

+0

Bu benim için çalışmıyor. Tüm "hedeflenen hedef geçiş" -1 "var değil. – tutiplain

269

Ben bu konuya biraz açıklık eklemek istiyorum: Ne Yukarıdaki yaptığını belirttiğiniz göç ile kalacaksın KADAR Tüm taşıma işlemlerini geri almak istediğini söylediğini

Update-Database -TargetMigration:"name_of_migration" 

. GET-GÖÇLER kullanmak ve size edersek Böylece A, B, C, D ve E, daha sonra E ve D geri alma bu komutu kullanarak C'ye almak için:

Update-Database -TargetMigration:"C" 

Ayrıca sürece tersine herkes yorum yapabilir, bir sıra değeri ve kısa -Target anahtarını kullanabileceğinizi fark ettim (böylece, -Target -TargetMigration ile aynıdır). Tüm göçler geri alma ve baştan başlamak istiyorsanız, kullanabilirsiniz:

update-database -target:0 

0, yukarıda, hatta İLK göçünü geri alma olur (bu yıkıcı komut - Eğer ne yaptığınızı bildiğinizden emin olun Kullanmadan önce!) - Hedef geçişin adını gerektiren yukarıdaki sözdizimini kullanırsanız yapamayacağınız bir şey (bir geçiş uygulanmadan önce 0 geçişin adı mevcut değildir!). Yani bu durumda, 0 (ordinal) değerini kullanmanız gerekir. Benzer şekilde, A, B, C, D ve E (bu sırayla) geçişlerini uyguladıysanız, sıra 1, A'ya başvurmalıdır, 2. sıradaki B, vb.

Update-Database -TargetMigration:"B" 

veya

Update-Database -TargetMigration:2 
+21

0 dizinindeki geçişin adı" $ InitialDatabase ". – MEMark

+0

Teşekkürler. Diğer dizin konumlarına başvurmak için herhangi bir $ (name) değer var mı? $ LatestDatabase olarak, ya da böyle bir şey mi? – Jazimov

+0

Bilmiyorum. Basit bir googling ile herhangi bir şey bulamadım.Ben EF kaynak kodu tarama onları ortaya çıkarır? – MEMark

8

çözümdür:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess 
+5

Bu soruda zaten belirtilmişse, asker bunu zaten biliyordu. Bunun nasıl yardımcı olduğunu anlamıyorum, belki bunu daha net yapabilirdiniz? – ANeves

28

yılında EntityFrameworkCore: Yani ya kullanabilirsiniz B'ye geri almak

Update-Database 20161012160749_AddedOrderToCourse 

20161012160749_AddedOrderToCourse, geri almak istediğiniz geçişin adıdır.

+1

GEM! Bu cevabı bulmak için biraz zamanımı aldı (.NET Core için değiştirdiklerinden). Kesinlikle bir değer! – HockeyJ

+1

artık işe yaramadı –

+0

Artık çalıştı, ancak çalışmıyor – xiamx