2013-10-02 21 views
19

Entity Framework sürüm 5'teki ilk geçiş kodlarında garip bir sorunla karşılaşıyorum. Bazen Update-Database beklemede olan değişiklikler nedeniyle başarısız oluyor, ancak Add-Migration komutu yalnızca son geçişlerde bulunan veritabanı değişikliklerine sahip geçişler üretiyor ve veritabanı güncel. Bu nedenle yeni göçün boş olmasını beklerdim.Ekleme Geçişi neden bazen çift geçişler oluşturur?

Add-Migration, hangi değişikliklerin neden kaynaklandığını nasıl algılar? Veritabanını bir kaynak olarak görmüyor.

cevap

35

Veritabanı modelinin bir anlık görüntüsü .resx dosyasındaki her geçişle birlikte kaydedilir. Yeni bir geçiş eklediğinizde, EF geçerli veritabanı modelini (model sınıflarınızdan ve DbModelBuilder öğenizin ayarlarından oluşturulan) son geçişle karşılaştırır ve bunlar arasında bir değişiklik belirler.

Tanımladığınız sorun, geçişleriniz senkronize değilse oluşabilir. İki geliştiricinin iki bağımsız geçiş yapması durumunda bu geçişler gerçekleşir ve bu geçişler daha sonra varsayılan şubeye yeniden birleştirilir.

Örnek:

Geliştirici 1

Geçiş AddColumnA

Geliştirici 2

Geçiş AddColumnB

Birleştirilmiş sürüm

Göç AddColumnA - veritabanı anlık kolumna

içerir

Göç AddColumnB - veritabanı anlık columnB içerir ancak başka göç eklerseniz değil kolumna

değişiklikler göç AddColumnB karşı belirlenir, Bu, columnA hakkında bilgi içermiyor. Bu soruna yönelik bir geçici çözüm, yalnızca son geçişte doğru veritabanı modeli anlık görüntüsüne sahip olmak için kukla geçiş (boş Up ve Down yöntemleriyle) oluşturmaktır.

Birleştirilmiş sürüm

Göç AddColumnA - veritabanı anlık kolumna

içerir

Göç AddColumnB - veritabanı anlık columnB içerir ancak kolumna

Göç Dummy - kolumna ve columnB

ile veritabanı anlık
+1

Çok ilginç. Taşımanın bu kaynak dosyasına göre oluşturulmasını engellemenin bir yolu var mı, bu nedenle veritabanı referans olarak kullanılıyor mu? Bu, yalnızca otomatik geçiş yerine EXPLICIT geçiş dosyalarına sahip olmak istediğimden, ancak aynı codebase'de birden çok dev ile çalışırken çok sayıda sahte taşıma dosyasına sahip olmak istemediğimden, benim görüşüme göre göçlerin ciddi bir dezavantajıdır. –

+2

IMHO veritabanını referans olarak belirtmenin bir yolu yoktur.Kukla geçişi oluşturmak yerine, ilk geçişi (AddColumnA) güncelleyebilir ve ardından ikinci geçişi yeniden oluşturabilirsiniz. Yukarı ve Aşağı yöntemleri aynı kalacaktır ancak veritabanı anlık görüntüsü doğru sürüme güncellenecek ve kukla geçiş gerekli olmayacaktır. –

+0

Tüm bilgiler için teşekkürler, ancak her bir birleştirme için değiştirmeler arasında geçiş yapmak, "çirkin"/boş birleştirme göç dosyalarına sahip olmaktan çok daha fazla bir güçlüktür. En azından her gün bir veya daha fazla birleşme yaparsanız. –

İlgili konular