2012-08-22 30 views
26

Sto cercando di ottenere il funzionamento delle migrazioni del framework Entity. Ho abilitato le migrazioni prima del codice, ha creato una cartella di migrazione, il file di configurazione e la tabella di storia di mig, ma nessuna creazione iniziale. Mi manca un passaggio? Questo è un nuovo db creato da EF (4.3.1).Nessuna creazione iniziale con le migrazioni di Entity Framework

+2

Dopo Abilita migrazioni, si deve aggiungere alla migrazione – Dabblernl

+0

fa non aggiunge nella prima creare la migrazione automaticamente? –

+2

questo potrebbe aiutare http: // StackOverflow.it/questions/11679385/reset-entity-framework-migrations – detay

risposta

21

Questo comportamento non è presente per impostazione predefinita, ma è disponibile facilmente in molte forme diverse.

  1. È possibile chiamare context.Database.CreateIfNotExists(); all'avvio dell'applicazione.

  2. È possibile utilizzare uno dei DatabaseInitializer s integrati. L'inizializzatore CreateDatabaseIfNotExists è incorporato in EntityFramework e deve solo essere aggiunto al progetto.

  3. È possibile creare il proprio inizializzatore di database personalizzato che include l'opzione # 1 all'interno di sé. Esempio: Code First Migrations and initialization

È possibile includere DatabaseInitializers nel progetto sia per codice o tramite un file di configurazione.

includono un'Initializer Database EntityFramework tramite il codice:

Nella vostra avvio dell'applicazione è possibile impostare il DatabaseInitializer in questo modo:

System.Data.Entity.Database.SetInitializer<DairyMmmContext>(new System.Data.Entity.CreateDatabaseIfNotExists<DairyMmmContext>()); 

NOTA: questo codice è cambiato più volte durante la vita di EntityFramework ! Questo esempio è per EF 4.3 che è l'attuale versione di produzione disponibile via nuget.

includono un'Initializer Database EntityFramework tramite elemento di configurazione:

<configuration> 
    <entityFramework> 
    <contexts> 
     <context type="MyNamespace.MyEFDataContext, AssemblyName"> 
     <databaseInitializer 
      type="System.Data.Entity.CreateDatabaseIfNotExists`2[[MyNamespace.MyEFDataContext, AssemblyName], 
       [MyNamespace.Migrations.Configuration, AssemblyName]], EntityFramework" /> 
     </context> 
    </contexts> 
    </entityFramework> 
</configuration> 

Noterete questo può essere un po ' "sgraziata" con questa configurazione. È necessario sostituire AssemblyName sopra con il nome dell'assembly in cui si tiene il materiale dell'entità, sostituire MyNamespace.MyEFDataContext con il nome completo del contesto dei dati dell'entità e sostituire MyNamespace.Migrations.Configuration con il nome completo nella classe di configurazione (per impostazione predefinita nella Migrazione cartella all'interno del tuo progetto).

EDIT: A cura di rispondere ai commenti aggiuntivi

Una migrazione è un cambiamento dalla definizione uno schema a un altro definizione dello schema. La creazione del database vuoto non è una migrazione (ma tutto ciò che è dopo). Non ci sarà alcun file sorgente di migrazione nel tuo progetto per la creazione di un db vuoto, che è fatto nel codice dall'inizializzatore.

Se si sta già utilizzando l'inizializzatore DropCreateDatabaseAlways, è necessario farlo. Tuttavia, ho notato che stai impostando l'inizializzatore nel codice, il che significa che c'è l'opportunità di un problema di temporizzazione (impostazione dell'inizializzatore dopo che il tuo contesto ha già superato il punto di chiamata di qualsiasi inizializzatore).

È possibile imporre a entityframework l'esecuzione del proprio inizializzatore in qualsiasi punto del codice con context.Database.Initialize(true); (il parametro è un vero/falso per forzare l'inizializzazione indipendentemente dallo stato corrente). Ciò farebbe cadere e ricreare il tuo database ogni volta.

Ma puoi anche assicurarti che il tuo inizializzatore sia impostato il prima possibile nel ciclo di vita della tua applicazione (prima di aver creato una singola istanza del tuo contesto).

+0

Grazie. Ho già questo in modo che si innesca quando viene creato il mio db: Database.SetInitializer (new DropCreateDatabaseAlways ()); Non è abbastanza buono per ottenere EF per creare il file di migrazione iniziale? –

+0

Inoltre, sembra che la prima creazione iniziale sia una migrazione automatica, non è sicuro se questo è il motivo per cui non esiste alcuno script di migrazione, quando provo a ripristinare il database iniziale, ripristina tutte le migrazioni tranne la creazione iniziale che è una migrazione automatica. .qualche idea? abilito le migrazioni solo dopo la creazione del db –

+0

@ newbie_86 Ho indirizzato i tuoi commenti rivedendo la mia risposta in quanto ritengo che anche altri utenti con gli stessi problemi in fondo possano trarre vantaggio da queste informazioni. – BenSwayne

4

Non sono sicuro che sia lo stesso, ma ho riscontrato un problema simile. Penso che il mio problema fosse legato al fatto che non uso una stringa di connessioni dal file di configurazione per ottenere la mia stringa di connessione.

Fidding con il progetto di avvio nella soluzione e anche la combinazione di progetti nella console di Gestione pacchetti sono riuscito a generare quella prima migrazione.

Inoltre, shure ha una stringa di connessioni con il nome della classe dbContext in modo che il Gestore pacchetti possa trovarla.

9

L'articolo/esercitazione qui here (on microsoft.com) descrive il motivo per cui non esiste una migrazione inizialeCreazione. La migrazione verrà aggiunta solo se il database esiste già. Altrimenti, la prima migrazione sarà il 'initialCreate' in quanto non è necessario creare una migrazione a un database che non esiste ancora ... nessun DB significa che non c'è nulla su cui eseguire il rollback, in una migrazione verso il basso.

Ecco il paragrafo pertinente:

Eseguire il comando Enable-Migrazioni nella console di Package Manager Questo comando ha aggiunto una cartella Migrazioni al nostro progetto, questa nuova cartella contiene due file:

La classe di configurazione. Questa classe consente di configurare il comportamento delle migrazioni per il proprio contesto. Per questa procedura utilizzeremo semplicemente la configurazione predefinita. Poiché nel progetto è presente un solo contesto Code First, Enable-Migrations ha inserito automaticamente il tipo di contesto a cui si applica questa configurazione.

Una migrazione InitialCrea. Questa migrazione è stata generata perché avevamo già creato il codice prima di creare un database per noi, prima di abilitare le migrazioni. Il codice in questa migrazione scaffold rappresenta gli oggetti che sono già stati creati nel database. Nel nostro caso quella è la tabella Blog con le colonne BlogId e Nome. Il nome file include un timestamp per aiutare con l'ordine.

Se il database non era già stato creato, questa migrazione InitialCreate non sarebbe stata aggiunta al progetto. Invece, la prima volta che chiamiamo Add-Migration il codice per creare queste tabelle verrebbe impalcato su una nuova migrazione.

0

Sto usando EF 6 RC1 e imbattuto in questo problema in cui né l'InitialCreate né __MigrationHistory sono stati creati durante l'esecuzione Enable-Migrazioni.

In realtà, subito dopo l'aggiornamento da EF 5 a EF 6 ho eseguito Enable-Migrations e per qualche ragione ha creato una tabella __MigrationHistory utilizzando lo schema EF 5, quindi l'ho cancellata e la mia directory Migrations e ho provato a ricominciare.

Ma ogni volta che ho eliminato la directory Migrations non creerebbe un InitialCreate o __MigrationHistory. Ho provato a rilasciare e ricreare il database e riavviare Visual Studio 2012 senza alcun risultato. Ho rinunciato per il giorno e il giorno dopo ho provato di nuovo, dopo aver lasciato il mio computer seduto per circa 8 ore, ho creato InitialCreate.Sto indovinando che ci deve essere una cache da qualche parte che ha un timeout molto lungo - chiunque? Sto anche indovinando che il riavvio potrebbe cancellare il cache, ma non l'ho provato.

In ogni caso, è possibile utilizzare PM> Add-Migration InitialCreate per eseguire manualmente tale passaggio.

In ogni caso, non ho ancora ricevuto una tabella __MigrationHistory. Apparentemente, EF 6 è stato modificato dalla sua creazione durante il comando Enable-Migrations per crearlo, invece, solo durante il comando Update-Database. E dato che il mio schema era già stato creato in quel punto, avevo bisogno di abbatterlo e ricrearlo manualmente:

PM> Update-Database -TargetMigration:0 
PM> Update-Database 

Ho anche smesso dopo il primo comando per controllare lo stato del database per assicurare che stavo aggiornando il correggere uno, dal according to this, la stringa di connessione al database viene prelevata o generata automaticamente a seconda della configurazione e, a meno che non sia configurata correttamente, non vi è alcuna garanzia che si acceda al database o all'istanza di SQL Server che si desidera.

Dopo aver eseguito entrambi i comandi ha creato una tabella __MigrationHistory e non l'ha creata come tabella di sistema (cosa che in realtà non volevo comunque), quindi tutto va bene. Non è esattamente lo stesso problema dell'OP, ma spero che questo sia utile a qualcun altro.

Riferimenti:

16

"iniziale Create" non viene creata automaticamente! Devi crearlo da solo. Alcuni tutorial di EF sono confusi e ho avuto lo stesso malinteso di te.

Quello che dovete fare:

-Add-Migration InitialModel 

Se avete già creato le tabelle del database e modello di dominio, quindi:

-Add-Migration InitialModel -IgnoreChanges 

Da questo punto, il codice sarà in sincronia con il database . Ogni volta che si modifica il codice, è possibile utilizzare Add-Migration per aggiungere le modifiche al database.

+0

Questo ha risolto il problema per me. –

+0

Sicuramente la soluzione più semplice per qualcuno con un database esistente. – JRadness

0

So che questo è vecchio, ma non esiste una risposta accettata e ho avuto lo stesso problema.

Il trucco è il comando Enable-Migrations. Come indicato here c'è un comando Enable-Migrations -EnableAutomaticMigrations. Che cosa fa inizia le migrazioni esattamente dove sei.

Se si desidera che la prima migrazione sia la creazione di database, eseguire semplicemente Enable-Migrations (senza --EnableAutomaticMigrations).

E ricordatevi di impostare initializer:

  Database.SetInitializer(new MigrateDatabaseToLatestVersion<LicenseContext, Configuration>()); 
Problemi correlati