Come posso disabilitare le migrazioni code first


86

Ho un modello di entità code-first in EF5. Ma voglio gestire manualmente le modifiche al database: non voglio che EF modifichi il mio database esistente e tutti i suoi dati. Ma quando apporto modifiche parallele alla mappatura EF e al database, EF si rifiuta di funzionare correttamente dicendomi che devo usare prima la migrazione del codice. Come lo spengo?


Risposte:


102

impostare Database.SetInitializer su null.

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
L'impostazione dell'inizializzatore sul costruttore dell'istanza del contesto non ha senso. EF chiamerà l'inizializzatore prima di arrivare effettivamente a quel codice se provi a creare un nuovo contesto.
Jcl

1
Ho appena verificato la risposta esaminando "Strumento di diagnostica" in VS 2017. Le chiamate ADO.NET prima della prima query SQL desiderata si sono interrotte dopo aver impostato l'inizializzatore su null nel costruttore.
Karl

2
Funziona come previsto. È vero che EF chiamerà l'inizializzatore prima, ma poi chiamandolo di nuovo all'interno del costruttore fa sì che DbContext ignori le migrazioni, nel caso in cui desideri ignorare il fatto che __MigrationHistorynon hai l'ultima migrazione e non vuoi fallo comunque. Nel mio caso, utilizzo le migrazioni in ambiente Dev, ma quando eseguo la distribuzione in produzione, utilizzo SSDT per aggiornare il database. Pertanto, EF si lamenterebbe che il modello è cambiato perché __MigrationHistorynon avrebbe l'ultima migrazione, ma posso garantire che il database sia aggiornato.
Alisson

Suggerirei di spostare la chiamata Database.SetInitializerdal costruttore al costruttore della classe. Ciò garantisce che la chiamata venga effettuata solo una volta.
Steven

41

Quindi la risposta più completa che ho trovato è questa:

  1. Elimina la Migrationscartella all'interno del tuo progetto.
  2. Impostato Database.SetInitializer<DatabaseContext>(null);all'interno del tuo inizializzatore DatabaseContext.
  3. Elimina la tabella __MigrationHistoryall'interno del tuo database. Per EF6 + la tabella si trova sotto, Tablesma per le versioni precedenti si trova sotto System Tables.
  4. Costruisci ed esegui.
  5. Profitto.

Sfortunatamente dopo aver seguito questi passaggi, EF6 controlla ancora l'esistenza di __MigrationHistoryogni volta che la mia applicazione si avvia, il che aggiunge qualche millisecondo in più al tempo di avvio della mia app. C'è un modo per disabilitare completamente il __MigrationHistorycontrollo?
Dai

27

Se desideri disattivare completamente le migrazioni:

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

Tuttavia, ho trovato meglio mantenere abilitate le migrazioni code first, ma utilizzare l' -Scriptopzione per fare in modo che EF crei uno script di modifica DB per me che posso applicare manualmente a ciascun database (sviluppo, controllo qualità, produzione):

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

In questo modo EF creerà lo script di modifica per me e ho ancora il pieno controllo sulle modifiche applicate. Eseguo la versione degli script di modifica come qualsiasi altro codice sorgente.


1
il tuo link non corrisponde realmente a completely turn off migrations. Per farlo: aggiungi Database.SetInitializer<YourContextType>(null)all'avvio della tua applicazione
Don Cheadle

Qualche idea su come ottenere questo risultato con EF Core?
Shimmy Weitzhandler

@ Shimmy: EF Core non dovrebbe mai tentare automaticamente di alterare il database. Vedi github.com/dotnet/efcore/issues/3152
Eric J.

26

Se hai già utilizzato le migrazioni, cambiare solo l'inizializzatore non sarà di aiuto. Devi andare a Management Studio, aprire le tabelle del database, andare alla System Tablescartella e rimuovere la __MigrationHistorytabella che si trova lì (per EF6 e versioni successive, si trova direttamente sotto Tables). Ciò disabiliterà definitivamente le migrazioni.


7
La tabella __MigrationHistory si trova direttamente sotto Tabelle, non Tabelle di sistema.
Peter Hedberg

6
@PeterHedberg Questo è vero per EF6 +. Per le versioni precedenti era sotto System Tables.
Episodex

1
Puoi anche rinominare la tabella, invece di eliminarla, usando sp_rename. Ho anche disabilitato l'inizializzatore.
NMrt

2

Ho appena risolto questo "problema" da

  1. Eliminazione della tabella "_MigrationHistory" dal database.
  2. Eliminazione della cartella "Migrazioni" dal progetto.
  3. Aggiornamento del file EDMX.
  4. Pulisci il progetto e ricostruiscilo.

La configurazione del mio ambiente sta seguendo

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

Posso chiederti cosa hai aggiornato nel file EDMX? Sto anche usando Database First e sta ancora interrogando le tabelle di migrazione inesistenti ... Grazie!
dalcam

E se in seguito avessimo bisogno di migrazioni, crea _MigrationHistoryautomaticamente una nuova tabella?
sairfan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.