Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
Solo EF6 e versioni successive : le funzionalità, le API e così via descritte in questa pagina sono state introdotte in Entity Framework 6. Se si usa una versione precedente, alcune o tutte le informazioni non si applicano.
Annotazioni
Questo articolo presuppone che si sappia come usare le migrazioni Code First in scenari di base. In caso contrario, sarà necessario leggere Le migrazioni Code First prima di continuare.
Che cos'è la tabella della cronologia delle migrazioni?
La tabella della cronologia delle migrazioni è una tabella usata dalle migrazioni Code First per archiviare i dettagli sulle migrazioni applicate al database. Per impostazione predefinita, il nome della tabella nel database è __MigrationHistory e viene creato quando si applica la prima migrazione al database. In Entity Framework 5 questa tabella era una tabella di sistema se l'applicazione usava il database di Microsoft Sql Server. Questa modifica è stata modificata in Entity Framework 6 e la tabella della cronologia delle migrazioni non è più contrassegnata come tabella di sistema.
Perché personalizzare la tabella della cronologia delle migrazioni?
La tabella della cronologia delle migrazioni dovrebbe essere usata esclusivamente dalle migrazioni Code First e modificarla manualmente può interrompere le migrazioni. Tuttavia, a volte la configurazione predefinita non è adatta e la tabella deve essere personalizzata, ad esempio:
- È necessario modificare i nomi e/o gli aspetti delle colonne per abilitare un provider di migrazioni di terza parte.
- Si vuole modificare il nome della tabella
- È necessario usare uno schema non predefinito per la tabella __MigrationHistory
- È necessario archiviare dati aggiuntivi per una determinata versione del contesto e pertanto è necessario aggiungere una colonna aggiuntiva alla tabella
Parole di precauzione
La modifica della tabella della cronologia della migrazione è efficace, ma è necessario prestare attenzione a non esagerare. Il runtime di EF non controlla attualmente se la tabella della cronologia delle migrazioni personalizzate è compatibile con il runtime. In caso contrario, l'applicazione potrebbe interrompersi in fase di esecuzione o comportarsi in modi imprevedibili. Ciò è ancora più importante se si usano più contesti per database, nel qual caso più contesti possono usare la stessa tabella della cronologia di migrazione per archiviare informazioni sulle migrazioni.
Come personalizzare la tabella della cronologia delle migrazioni?
Prima di iniziare, è necessario sapere che è possibile personalizzare la tabella della cronologia delle migrazioni solo prima di applicare la prima migrazione. Ora, al codice.
Prima di tutto, è necessario creare una classe derivata dalla classe System.Data.Entity.Migrations.History.HistoryContext. La classe HistoryContext deriva dalla classe DbContext, quindi la configurazione della tabella della cronologia delle migrazioni è molto simile alla configurazione dei modelli EF con l'API Fluent. È sufficiente eseguire l'override del metodo OnModelCreating e usare l'API Fluent per configurare la tabella.
Annotazioni
In genere, quando si configurano i modelli EF non è necessario chiamare base. OnModelCreating() dal metodo OnModelCreating sottoposto a override perché DbContext.OnModelCreating() ha un corpo vuoto. Questo non è il caso durante la configurazione della tabella della cronologia delle migrazioni. In questo caso, la prima operazione da eseguire nell'override onModelCreating() consiste nel chiamare effettivamente base. OnModelCreating(). In questo modo, la tabella della cronologia delle migrazioni verrà configurata nel modo predefinito, che poi si può personalizzare nel metodo di override.
Si supponga di voler rinominare la tabella della cronologia delle migrazioni e inserirla in uno schema personalizzato denominato "admin". Inoltre, l'amministratore di database vuole rinominare la colonna MigrationId in Migration_ID. A tale scopo, è possibile creare la classe seguente derivata da HistoryContext:
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Migrations.History;
namespace CustomizableMigrationsHistoryTableSample
{
public class MyHistoryContext : HistoryContext
{
public MyHistoryContext(DbConnection dbConnection, string defaultSchema)
: base(dbConnection, defaultSchema)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<HistoryRow>().ToTable(tableName: "MigrationHistory", schemaName: "admin");
modelBuilder.Entity<HistoryRow>().Property(p => p.MigrationId).HasColumnName("Migration_ID");
}
}
}
Quando il tuo HistoryContext personalizzato è pronto, devi farlo conoscere a EF registrandolo tramite la configurazione basata su codice:
using System.Data.Entity;
namespace CustomizableMigrationsHistoryTableSample
{
public class ModelConfiguration : DbConfiguration
{
public ModelConfiguration()
{
this.SetHistoryContext("System.Data.SqlClient",
(connection, defaultSchema) => new MyHistoryContext(connection, defaultSchema));
}
}
}
Questo è tutto. È ora possibile passare alla console di Gestione pacchetti, alle migrazioni abilitate, Add-Migration e infine a Update-Database. Ciò dovrebbe comportare l'aggiunta al database di una tabella della cronologia delle migrazioni configurata in base ai dettagli specificati nella classe derivata HistoryContext.