Varlık çerçevesinde açık bir geçiş oluşturulamıyor


96

Yeni bir taşıma ekliyorum ancak bu mesaj şunu gösteriyor:

Şu açık geçişler beklemede olduğu için açık bir geçiş oluşturulamıyor: [201203170856167_left]. Yeni bir açık geçiş oluşturmaya çalışmadan önce bekleyen açık geçişleri uygulayın.

Biri bana yardım edebilir mi?


11
Bu, başlangıç ​​projemi yanlışlıkla farklı bir projeye geçirdiğimde başıma geldi. Siz (veya bunu okuyan diğerleri), daha derinlemesine sorun giderme denemeden önce bunu hızlı bir şekilde kontrol etmek isteyebilirsiniz (özellikle geçişleri silmeye başlamanız gerekenler vb.
NicholasFolk

Migration dizininde, veritabanının _MigrationHistory bölümünde güncellenmeyen bir geçiş sınıfı var. Bu sınıfı hem Migration dizininde hem de veritabanında aynı duruma getirmek için kaldırmak sorunumu çözdü.
Aryan Firouzian

1
Bu bana rastgele olur. Bu olduğunda, tüm geçişlerimin uygulanması gerektiğini gösteriyor. Çalışması için Visual Studio'yu yeniden başlatmam gerekiyor çünkü zaten her şey doğru şekilde ayarlanmış.
Larry Flewwelling

Yanıtlar:


82

Size uygulamanızda bazı işlenmemiş geçişler olduğunu ve Update-Databasebaşka bir geçiş eklemeden önce çalıştırılması gerektiğini söyler .


12
İlk geçişi yeniden oluşturmak için ne istiyorum? Bu, bunu yapmanızı engelliyor mu?
Rebecca

Benim için çalışmadı, Güncelleme-Veritabanı bana başka bir hata verdi. Önce bekleyen dosyaları silmem gerekiyordu.
Vahx

1
Thomas'ın cevabı benim benzer durumum için faydalı oldu.
Tarek Shawadfy

2
Bir başlangıç ​​projesi ilan etmek gerekli olabilir-StartupProject ContentHub.Database
osanger

2
Update-Databaseverir> Veritabanı mevcut modelle eşleşecek şekilde güncellenemiyor çünkü bekleyen değişiklikler var
ASpirin

54

Ben de aynı sorunu yaşadım. Görünüşe göre varlık çerçevesi, veritabanına bağlanamadığında bu hatayı oluşturur. Bu nedenle, diğer sorunları aramadan önce ona erişebildiğinizden emin olun.


1
Ayrıca, App.config'inizi başka bir projeye taşıdığınızda veya sadece projenizde eksikse veya projenizdeyse ancak yanlış yapılandırılmışsa durumun böyle olacağını da ekleyeceğim.
Code Maverick

IP'm değiştikten sonra aynı hatayı aldım (hem konum değiştirdikten sonra hem de bir dyn dns değişikliğinden sonra oldu). Bu, oturum açma işlemini iptal etmek için kullandığımız Azure Veritabanındaki güvenlik duvarına neden oldu. Yararsız bir şekilde EF geçişleri "oturum açılamadı" yerine yukarıdaki hatayı veriyor ...
Victor

8
Yapmak istediğim bir diğer nokta da, başlangıç ​​projenizin db bağlamınızın bağlantı dizesi ile bir olup olmadığını kontrol ettiğinizden emin olmaktır. Başlangıç ​​projemi geçici olarak değiştirdiğimde bu sorunu yaşadım ve diğer projenin aynı bağlantı dizesine sahip olmadığını fark etmedim.
Gage Trader

@GageTrader'a ekleme: Birden çok başlangıç ​​projem vardı, biri yapılandırmasız ve EF-config ile web projesi. (Depo) projesi, geçişleri olan app.config dosyasında web projesiyle aynı EF yapılandırmasına sahiptir. ancak depo projesini başlangıç ​​projesi olarak seçtiğimde bile işe yaramadı, ancak web projesini başlangıç ​​olarak ayarladığımda işe yaradı.
JimiSweden

Benim için hile yapan -ConnectionString parametresini açıkça belirtmek zorunda kaldım
Brian Colavito

34

Değişikliklerinizi veritabanına göndermek için paket yöneticisi konsolundan "güncelleme-veritabanını" çalıştırmanız gerekir VEYA bekleyen geçiş dosyasını ([201203170856167_left]) Taşıma klasörünüzden silebilir ve ardından "add-migration" ı yeniden çalıştırarak Düzenlemelerinize göre yepyeni bir geçiş oluşturun.


1
Taşıma dosyasını sildim ve add-migration çalıştırdım, ancak yine de aynı hatayı veriyor.
nu everest

2
Teşekkürler, bekleyen taşıma dosyasını silme ile ilgili ipucu cankurtaran oldu
Manish

32

Bu hata, geçişlerin artık tanınmadığı anlamına da gelebilir. Bu, Migrations.Configuration'da ContextKey'in değerini değiştirdikten sonra başıma geldi. Çözüm basitçe "__MigrationHistory" veritabanı tablosundaki ContextKey'i güncellemekti (veya tahmin ettiğim Configuration sınıfındaki değeri geri döndürmekti). Uygulamanızdaki ContextKey ve Namespace eşleşmelidir.


1
Durumum için doğru cevap buydu. Yeni bir benzer proje için eski projelerimden birini kullandığım için, eski geçişler üzerinden DB'de değişiklik yapamadım. Thomas'ın önerdiği gibi, ad alanı, _MigrationsHistory tablosundaki Contextkey'den Geçişlerde farklıydı, bu da eski geçişlerin tanınmamasına neden oldu.
Tarek Shawadfy

1
Çözümü yeniden adlandırarak soruna neden olduğum için bu bana yardımcı oldu. Bu süreçte ContextKey'i yeniden adlandırdım, böylece artık _MigrationHistory girişleriyle eşleşmiyordu.
Joel

Ayrıca benim için çalıştı, yapılandırmada açık bir bağlam anahtarı ayarla, __MigrationHistory'de değiştirdi ve güncelleme-veritabanı her şeyin harika olduğuna karar verdi. Teşekkürler!
James White

2
Gülünç ama doğru. Proje adını güncellediyseniz veya projenizi (benim durumum) birkaç parçaya böldüyseniz ve yeni bir projeden aynı veri tabanına yeni geçiş eklemeye çalışıyorsanız, doğru ContextKey kullanmanız gerekir, bunu Yapılandırma yapıcısında ayarlayabilirsiniz ( __MigrationHistory tablosunda bulunan Context anahtarını kullanmanız gerekir)
BotanMan

aynı burada, varsayılan ad alanımı yeniden adlandırdım ve bu soruna neden olan çözümüm boyunca değiştirdim
WtFudgE

20

1. Bağlantı Dizesi / Bağlantı İzinleri

Bağlantı dizesini tekrar kontrol edin.

Eğer bağlantı emin kullanıcıyı olun hala okuma izni olan [__MigrationHistory]ve düzenlemek için şemayı iznine sahip.

Add-migration komutunu kendiniz olarak çalıştırmak için Integrated Security (Windows Auth) kullanmak için Uygulama veya Web yapılandırma dosyasındaki bağlantı dizesini değiştirmeyi de deneyebilirsiniz .

Örneğin:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

Bu bağlantı dizesi, DbContext'in bulunduğu projenin App.config dosyasına gidecektir.

2. Başlangıç ​​Projesi

StartUp projesini komut satırında belirtebilir veya projeye DbContext, Configurationand Migrations klasörüne sağ tıklayıp Set as StartUp project seçeneğini seçebilirsiniz . Ciddiyim, bu aslında yardımcı olabilir.

görüntü açıklamasını buraya girin


Haha. Bunun daha fazla oy almasını dilerdim. Bu bana çok oluyor ve Integrated Securitydüzeltme harika çalışıyor!
Jess

1
Aynı sorunu yaşadım, geçiş komutlarından hiçbiri çalışmadı. Görünüşe göre suçlu başlangıç ​​projesini belirlemiyor. Bunu ayarlamak sorunumu çözdü.
Vishal

Başlangıç ​​projesini değiştirmek benim için çalıştı! İşe yaramayacağından emindim ama her şey başarısız olduğu için yine de denedim. Mükemmel cevap.
Sylvain Rodrigue

"Başlangıç ​​Olarak Ayarla" - asla tahmin edemezdim! Teşekkür ederim!!
Jasel

1
Evet, başlangıç ​​projesini kasıtlı olarak değiştirdim ve geri almayı unuttum. Komik olan şu ki, daha önce bir geçiş uygun başlangıç ​​projesiyle yapılmıştı, bu yüzden her şey yolunda gitti. Ancak bu artık mantıklı - b / c EF projeden bağlantı dizesi alıyor, bu nedenle geçişlerin aslında DB'ye uygulandığını "bilmiyor" ...
kosist

8

Aynı sorunu yaşadım ve yukarıdaki cevaplardan bazı ipuçlarıyla çözebildi:

  • Paket yöneticisi konsolunda varsayılan projeyi kontrol edin (taşıma yapılandırmasına sahip projeyi işaret edin)
  • Başlangıç ​​projesinin geçerli bir bağlantı dizesine sahip bir web.config (veya
  • Geçiş içeren projenin geçerli bir bağlantı dizesine sahip bir app.config / web.config olduğundan emin olun
  • Veritabanındaki izinleri kontrol edin (bağlantı dizenizde yapılandırılan kullanıcı için)

Taşıma işlemlerinin bağlanmaya çalıştığı yerlerde daha spesifik bilgiler almak için paket yöneticisi konsolunda "update-database -verbose" kullanın. (Benim durumumda, başlangıç ​​projemin doğru ayarlanmadığını bulmam için yardım ettim ...)


2
"update-database -verbose" çalıştırdı ve bağlantı dizemin bozuk olduğunu fark ettim, lol. Yani add-migration komutu yanlış mesaj veriyor.
Wachburn

4
"Başlangıç ​​projesinin {...}" sorunumu çözdüğünden emin olun. Teşekkürler @flex
Andy Schmitt


7

Bu sorunla karşılaştığınızda, lütfen add-migration cmdlet'inize parametreler eklemeyi deneyin. Örneğin, başlangıç ​​projesinin yanı sıra bağlantı dizesi adını belirtmek, EF'in hedef veritabanınızı bulmasına yardımcı olabilir.

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

Nerede:

Delta_Defect_0973 , geçişinizin adıdır

your.namespace.ContextClassName , geçiş klasörünüzdeki Configuration sınıfınızın adıdır ve önünde tam ad alanı bulunur.

DeltaProject , web.config veya app.config dosyanızla birlikte ana projenizin adıdır.

DeltaSQL , web.config veya app.config dosyanızda tanımlanan bağlantı dizenizin adıdır.


Teşekkürler. Bu bana gerçekten yardımcı oldu.
Jess

Ayrıca, çözümünüzde bağımlılık enjeksiyonu kullanıyorsanız, Paket Yöneticisi Konsolunda farklı bir Varsayılan Proje seçmeniz gerekebilir. EF, geçişlerinizi bulamıyorsa, varsayılan proje olarak geçişleri içeren projeyi seçmeyi deneyin.
Yves Rochon

5

Bu hata, başka bir açık geçişi gerçekleştirebilmeniz için bekleyen taşıma işlemlerinin gerçekleştirilmesi gerektiği anlamına gelir. Sen seçebilirsin

  1. Update-Database komutunu kullanarak bekleyen taşıma işlemlerini yürütün
  2. Bekleyen taşıma işlemlerini silin. En güvenli yol, Geçişler klasörünü açmaktır, [201203170856167_left] 'e sağ tıklayın> Projeden çıkar

Bundan sonra tekrar "Add-Migration ..." başlatabilirsiniz.

Umarım yardımcı olur


4

Sadece iki sentim:

Benim senaryom:

  1. Yerel veritabanımı çalışma durumuna geri yükledim.
  2. Zaten buna uygulanmış geçişler vardı.
  3. Ne zaman yeni bir taşıma eklemeye çalışsam, OP'mde belirtildiği gibi bekleyen geçişlerle ilgili hata alıyorum.

Çözüm:

Bunu aşmak için sadece daha açık parametreler sağladım:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

App.config klasörünüzde bu davranışı varsayılan olarak ayarlamanıza izin verecek bir ayar belirleyebileceğinize inanıyorum, böylece her seferinde açık parametreler sağlamak zorunda kalmazsınız. Ancak bunu nasıl yapacağımdan emin değilim.


1
Bu benim için çalıştı, sadece yukarıda gösterilen komutun sonuna geçişin adını ekledim.
sfors, Monica'yı

1
=) - yardımcı olabildiğime sevindim.
IbrarMumtaz

1
-ConnectionStringNamebuna bir alternatiftir ve bağlantı dizesini yapılandırmanızdan ada göre çekecektir
Simon_Weaver

1
Bu bana yardımcı oldu çünkü bağlantı dizesini yapılandırma dosyasında
saklamıyorum

3

Bir belirsizlik ve dolayısıyla hata var. En iyi yol, geçerli geçiş dosyasını dışarıda bırakmak ve yeni geçiş ( ekleme-taşıma ) dosyası oluşturmak ve ardından yeni geçiş içeriğini dışarıda bırakılan dosyaya kopyalayıp yeniden dahil etmek ve veritabanı güncelleme komutunu çalıştırmaktır .


Sadece update-databasekomutu çalıştırdım, sonra komutumu yeniden add-migration
denedim

3

aynı sorunu şöyle çözdüm:

  • eski taşıma dosyasını sil
  • güncelleme-veritabanı -force
  • Add-Migration addedEntity
  • veri tabanını güncelle

1

Aynı sorunları yaşadım ve yalnızca Add-Migration 'MigrationName' -Force çalıştırarak çözebildim

-Gücün önemli bir parçası olduğu.


1

Yerel veri __MigrationHistorytabanımda nüfus yoktu veya mevcut değildi. Tabloyu manuel olarak oluşturdum ve ardından bu tablodaki verileri PROD'den yerel veritabanıma taşıdım. Bu, VS'nin geçişlerin uygulandığını düşünmesine neden oldu (daha önce yapılmıştı).


aynı sorunu yaşadım, canlı DB'mi üretimle birleştirdim ancak bu nedenle geçiş geçmişi kayboldu.
matthy

1

İpucu:-Script Emin değilseniz geçiş komutları için anahtarı kullanmak her zaman iyidir . Aynı zamanda gerçekte ne yaptığını anlamaya da gerçekten yardımcı olur Update-Database.

Veritabanını güncellemek için aşağıdakileri çalıştırıyorum, ardından manuel olarak uygulayabileceğim (veya sadece -Script etiketi olmadan tekrar çalıştırabileceğim) bir komut dosyası alıyorum.

Çünkü Update-Databaseaşağıdakileri çalıştırırdım:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

SQL_AzureLiveYapılandırmamdaki adlandırılmış bağlantı dizesi nerede .

Sonra SQL'in doğru göründüğünü doğrulayabilir, uygulayabilir ve tamamlayabilirim. Diğerlerinin söylediği gibi, bağlantı dizesi yanlış veya geçersizse bu hatayı alırsınız.


1

Benim için taşıma dosyasını (sizin durumunuzda "201203170856167_left") Migrationsklasörden sildim ve ardından Paket Yöneticisi konsolunda aşağıdaki komutu çalıştırdım

Add-Migration <Parameter>
Update-Database

0

Senaryo

  • Yeni bir DB geçişi oluşturduğum bir şubede çalışıyorum.
  • Ana birimden güncelleme yapmaya hazırım, ancak ana birimin de yakın zamanda bir DB geçişi var.
  • Çakışmaları önlemek için şubemin db geçişini siliyorum.
  • Ben "ustadan güncelle".

Sorun

Ana sunucudan güncelleme yaptıktan sonra "Add-Migration my_migration_name" komutunu çalıştırıyorum, ancak aşağıdaki hatayı alıyorum:

Aşağıdaki açık geçişler beklemede olduğu için açık geçiş oluşturulamıyor: [201607181944091_AddExternalEmailActivity]. Yeni bir açık geçiş oluşturmaya çalışmadan önce bekleyen açık geçişleri uygulayın.

Bu yüzden "Veritabanını Güncelle" yi çalıştırıyorum ve aşağıdaki hatayı alıyorum:

Bekleyen değişiklikler olduğundan ve otomatik geçiş devre dışı bırakıldığından veritabanı mevcut modelle eşleşecek şekilde güncellenemiyor

Çözüm

Bu noktada "Add-Migration my_migration_name" i yeniden çalıştırmak sorunumu çözdü. Benim teorim, "Veritabanını Güncelle" yi çalıştırmanın, "Ekleme-Taşıma" nın çalışması için gereken her şeyi olması gerektiğidir.


0

Ben de bu konuyla karşılaştım. Yeni DB oluşturduğumda geldi ve kod ilk DB geçişim için bekleyen değişikliklerim vardı ve ardından "Veritabanını Güncelle" komutunu çalıştırmayı denedim. Çözüm: Yeni DB için yeni geçiş oluşturmak için "Add-Migration -MigrationName" komutunu çalıştırın. Ardından "Veritabanını Güncelle" komutunu çalıştırın.


0

Add-Migration'ı çalıştırırken güncel olduğunu bildiğim bir veritabanı için de bu sorunu yaşadım. Basitçe Add-Migration komutunu ikinci kez çalıştırarak çözüldü. Yukarıda Robin Dorbell tarafından önerildiği gibi bir bağlantı sorunundan şüphelenin.


Benim senaryomda Veritabanı adı, komutu çalıştırırken büyük / küçük harf duyarlıydı. bağlantı
dizisini db'deki ile

0

Bu, db'de zaten var olan eski göç sınıfını aniden yeniden adlandırdığımda oldu. VCS geçmişini kontrol ettim, belirledim ve yeniden adlandırdım. Hepsi daha sonra çalıştı.


0

Başka bir yol yaptım. Veritabanını tamamen bıraktım ve "güncelleme-veritabanı" nı tekrar çalıştırdım.


Bu, uygulanabilir bir düzeltme sağlamaz; geçerli geçiş, mevcut yapıyı korur.
Ferdipux

0

Daha basit bir problemim vardı. VS, iş istasyonuma bağlı bir istemcinin sitesine VPN bağlantım olduğunda bu hatayı yanlışlıkla bildirdi. Sorun, DBMS güvenliğinin yalnızca gerçek yerel IP'mden gelen istekleri kabul edecek şekilde ayarlanmasıydı. Basitçe VPN'i kapatmak sorunu çözdü.


0

Benim durumumda, IP adresimi Azure'daki güvenlik duvarı kurallarına eklemeyi unuttum, temelde veritabanına bağlanamadığım için bu hatayı alıyordum. Bu yüzden özellikle benim durumum için, IP adresimi Azure'daki veritabanı güvenlik duvarı kurallarına ekledim ve her şey yolunda gitti. Bunun dışında, proxy / internet bağlantısı / DB kullanıcı adı şifresi / DB bağlantı dizesi vb. Sorun olabilir VEYA açıkçası, Update-Database komutunu çalıştırmanız gereken bekleyen geçişleriniz olabilir.


0

Tarihsel olarak bunu her zaman bekleyen taşıma işlemlerini silerek çözdüm ya da yalnızca 1 tane kaldıysa ve çoğunlukla arzu edildiyse, -f yeniden oluşturmak için çözdüm.

Son zamanlarda, bu benim için çalışmayı bıraktı.

Bu ilk kez gerçekleştiğinde, Visual Studio'yu yeniden başlattım ve devam etmeme izin verdi.

İkinci kez, sadece projede bir Temizlik yaptıktan sonra işe yaradı. Gezginden tüm dosyalar silinmesine rağmen neredeyse bekleyen geçişler korunmuş gibiydi.


0

Bu birçok insan için cevap olmayacak, ancak EF, DB'ye bağlanamadığında bu hatayı atacak. Benim gibi evden çalışıyorsanız, hala VPN'inize bağlı olduğunuzdan emin olun!


0

Eski gönderi ama birine yardımcı olabilir. Benim için bu oldu çünkü yeniden adlandırdım Assembly nameve Default namespaceproje. Bu yüzden güncellemek zorunda ContextKeyiçinde _MigrationHisotryyeni değerine masaya Assembly nameya Default namespace. Açıkçası hangisinin kullanılması gerektiğini bilmiyorum, çünkü benim için ikisi de aynı!


-1

Bir göçten diğerine döndükten hemen sonra aynı sorunu yaşadım.

Benim durumumda, "migration06" dan "migration04" e "göçü hedefledim".

"Migration0" 6'yı silmem gerekiyordu ve ardından "migration05" oluşturmaya zorlayabildim. Bu temelde, bir sonraki geçişi hedeflenenden sonra tutmanız gerektiği anlamına gelir.


-1

Benim durumumda (MS Visual Studio kullanarak), Visual Studio'yu yeniden başlatmak kadar basitti.

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.