İlk kod geçişlerini nasıl devre dışı bırakabilirim


86

EF5'te kod ilk varlık modelim var. Ancak veritabanı değişikliklerini manuel olarak yönetmek istiyorum - EF'nin mevcut veritabanımı ve tüm verilerini değiştirmesini istemiyorum. Ancak EF eşlemesinde ve veritabanında paralel değişiklikler yaptığımda, EF düzgün çalışmayı reddediyor ve bana önce kod geçişini kullanmam gerektiğini söylüyor. Bunu nasıl kapatırım?


Yanıtlar:


102

Database.SetInitializer'ı null olarak ayarlayın.

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }

2
Başlatıcıyı bağlamın örnek yapıcısında ayarlamak bir anlam ifade etmiyor. Yeni bir bağlam oluşturmaya çalışırsanız EF, bu koda ulaşmadan önce başlatıcıyı çağırır.
Jcl

1
Cevabı sadece VS 2017'deki "Tanılama Aracı" na bakarak doğruladı. İlk istenen SQL sorgusundan önce ADO.NET çağrıları, başlatıcıyı yapıcıda null olarak ayarladıktan sonra durdu.
Karl

2
Beklendiği gibi çalışıyor. EF'in daha önce başlatıcıyı çağıracağı doğru, ancak daha sonra yapıcı içinde tekrar çağırmak, DbContext'in geçişleri yok saymasına __MigrationHistoryneden oluyor, en son geçişinizin olmadığı gerçeğini görmezden gelmek istemeniz ve istemiyorsanız yine de yap. Benim durumumda, geliştirme ortamında geçişleri kullanıyorum, ancak üretime dağıtım yaptığımda veritabanını güncellemek için SSDT kullanıyorum. Bu nedenle, EF modelin değiştiğinden şikayet ederdi, çünkü __MigrationHistoryen son geçişe sahip olmayacaktı, ancak veritabanının güncellendiğini garanti edebilirim.
Alisson

Çağrıyı Database.SetInitializeryapıcıdan sınıf yapıcısına taşımayı öneririm . Bu, aramanın yalnızca bir kez yapılmasını sağlar.
Steven

41

Yani bulduğum en eksiksiz cevap şudur:

  1. MigrationsProjenizin içindeki klasörü silin .
  2. Database.SetInitializer<DatabaseContext>(null);DatabaseContext başlatıcınızın içinde ayarlayın .
  3. __MigrationHistoryVeritabanınızın içindeki tabloyu silin . EF6 + için tablo altında bulunur, Tablesancak daha önceki sürümler için altında bulunur System Tables.
  4. Oluşturun ve çalıştırın.
  5. Kar.

Ne yazık ki bu adımları izledikten sonra, EF6 hala __MigrationHistoryuygulamamın her başladığında var olup olmadığını kontrol ediyor ve bu da uygulamamın başlangıç ​​zamanına birkaç milisaniye daha ekliyor. __MigrationHistoryÇeki tamamen devre dışı bırakmanın bir yolu var mı ?
Dai

27

Taşıma işlemlerini tamamen kapatmak istiyorsanız:

https://stackoverflow.com/a/9709407/141172

Ancak, önce kod geçişlerini etkin tutmanın daha iyi olduğunu buldum, ancak -ScriptEF'in benim için her veritabanına (geliştirme, QA, Üretim) manuel olarak uygulayabileceğim bir DB değişiklik betiği oluşturması seçeneğini kullanıyorum :

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

Bu şekilde, EF benim için değişiklik betiğini oluşturacak ve uygulanmakta olan değişiklikler üzerinde tam kontrole sahip olmaya devam ediyorum. Değişiklik betiklerini diğer kaynak kodlar gibi versiyonlarım.


1
bağlantınız gerçekten uyuşmuyor completely turn off migrations. Bunu yapmak için: Database.SetInitializer<YourContextType>(null)başvurunuzun başlangıcına ekleyin
Don Cheadle

Bunu EF Core ile nasıl başaracağınıza dair bir fikriniz var mı?
Shimmy Weitzhandler

@Shimmy: EF Core asla veritabanınızı otomatik olarak değiştirmeye çalışmamalıdır. Bkz. Github.com/dotnet/efcore/issues/3152
Eric J.

26

Zaten Geçişler kullandıysanız, yalnızca Başlatıcıyı değiştirmek yardımcı olmayacaktır. Management Studio'ya gitmeniz, veritabanı tablolarınızı açmanız, System Tablesklasöre __MigrationHistorygitmeniz ve orada bulunan tabloyu kaldırmanız gerekir (EF6 ve üstü için doğrudan altında bulunur Tables). Bu, Göçleri tamamen devre dışı bırakacaktır.


7
__MigrationHistory tablosu Sistem Tablolarının değil, doğrudan Tabloların altında yer alır.
Peter Hedberg

6
@PeterHedberg Bu EF6 + için geçerlidir. Daha önceki sürümler için altındaydı System Tables.
Bölüm

1
Kullanarak silmek yerine tabloyu yeniden adlandırabilirsiniz sp_rename. Başlatıcıyı da devre dışı bıraktım.
NMrt

2

Bu "sorunu" az önce çözdüm

  1. Veritabanından "_MigrationHistory" tablosu siliniyor.
  2. Projeden "Migrations" klasörünün silinmesi.
  3. EDMX dosyası güncelleniyor.
  4. Projeyi temizleyin ve yeniden inşa edin.

Ortamımın yapılandırması takip ediyor

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0

EDMX Dosyasında neleri güncellediğinizi sorabilir miyim? Ben de Database First kullanıyorum ve hala var olmayan Migration Tablolarını sorguluyor ... Teşekkürler!
dalcam

Ya daha sonra geçişlere ihtiyacımız olursa, _MigrationHistoryotomatik olarak yeni tablo oluşturur mu?
sairfan
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.