5

Ho ristrutturato il mio progetto che ha portato a una modifica del nome dello spazio dei nomi del contesto del database e della configurazione del Primo codice associato. A quel punto, ho avuto una migrazione impalcatura, "InitialCreate" e quindi la tabella __MigrationHistory del mio database conteneva una riga singola con alcuni MigrationId e uno ContextKey contenenti il ​​nome dello spazio dei nomi e il nome classe della classe Configuration.Migrazione dello scaffold con modifica della chiave di contesto

Dopo aver spostato le cose, l'esecuzione di Get-Migrations non ha restituito risultati, dopo aver modificato il ContextKey come da consiglio del mio collega, la migrazione "InitialCreate" è stata correttamente enumerata.

Quali passaggi devo prendere durante le modifiche in modo che la continuità delle mie migrazioni non sia stata interrotta, impedendo la necessità di rinominare manualmente lo ? Ovviamente, non è un grosso problema per una migrazione applicata, tuttavia sarebbe un enorme problema da fare per dozzine di migrazioni applicate.

risposta

12

Sono rimasto bloccato per molto tempo e ho chiesto e risposto here. Nei documenti EF è possibile trovare la spiegazione sui tasti di scelta rapida here .È necessario creare la configurazione migrazione personalizzata in questo modo:

public class MyMigrationConfiguration : DbMigrationsConfiguration<MyMigrationContext> 
{ 
    public MyMigrationConfiguration() 
    { 
     AutomaticMigrationsEnabled = false; 
     AutomaticMigrationDataLossAllowed = false; 
     MigrationsNamespace = "My.Migrations.Assembly"; 
     MigrationsDirectory = "My/Migrations/Directory"; 
     ContextKey = "MyContexKey"; // You MUST set this for every migration context 
    } 
} 
+0

Grazie per l'intuizione, terremo sicuramente questo in mente. –

3

Ho appreso che la classe DbMigrationsConfiguration{TDbContext} ha una proprietà denominata ContextKey (EF6 e la sua funzione "migrazioni multi-tenant") che consente di impostare in modo esplicito la chiave di contesto. Questa proprietà verrebbe impostata se si usasse il parametro -ContextTypeName del comando Enable-Migrations nella Console di Gestione pacchetti.

Non sembra che la chiave di contesto possa essere modificata una volta applicata la prima migrazione, tuttavia con l'opzione di impostare la chiave di contesto in questo modo dopo che il nome del tipo di classe di configurazione è cambiato, è quasi inutile se si può tollerare alcune disparità nel database.

2

ho avuto due progetti di database separati - uno contenente il modello e la mappatura, altro che contiene solo la configurazione e la migrazione tutte le migrazioni. Ho fusi progetto contenente le migrazioni nel progetto che contiene il modello, ecc

Alla fine ho risolto problema con l'impossibilità di aggiungere nuovi migrazione o tenere il database aggiornato o la migrazione dello schema di stato precedente, rendendo tali passaggi:

  • Ho modificato gli spazi dei nomi nel progetto unito a tutte le migrazioni e la configurazione stessa al nuovo valore dello spazio dei nomi.
  • ho eseguito dichiarazione seguente contro la base di dati:

    USE [DatabaseName] 
    
    GO 
    
    UPDATE [dbo].[__MigrationHistory] 
        SET [ContextKey] = N'NewNamepacePlusConfigurationClassName'  
    WHERE ContextKey= N'NamepacePlusConfigurationClassName' 
    
    GO 
    
  • io costruisco progetto contenente le migrazioni con la configurazione

Ora tutto funziona come previsto, mi sono nemmeno in grado di cambiare lo schema all'indietro istruzione using

Update-Database -TargetMigration PreviousMigration 
+0

Cosa succede se la colonna non esiste in _MirtationHistory? –