Ho problemi nell'utilizzo delle migrazioni di Entity Framework indirizzate ai database Oracle poiché il nome dello schema è incluso nel codice di migrazione e per Oracle, il nome dello schema è anche nome utente. Il mio obiettivo è quello di avere Code First Migrations indipendenti dallo schema (per poter avere una serie di migrazioni per gli ambienti di test e produzione).Codice schema entità indipendente dallo schema Prime migrazioni
Ho già provato questo approccio (utilizzando Entity Framework 6.1.3):
1) Non ho nome dello schema in Web.config:
<add key="SchemaName" value="IPR_TEST" />
2) Il mio DbContext prende nome dello schema come parametro del costruttore:
public EdistributionDbContext(string schemaName)
: base("EdistributionConnection")
{
_schemaName = schemaName;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema(_schemaName);
}
3) ho dovuto implementare IDbContextFactory per l'entità migrazioni Framework per essere in grado di creare il mio DbContext che non ha costruttore senza parametri:
public class MigrationsContextFactory : IDbContextFactory<EdistributionDbContext>
{
public EdistributionDbContext Create()
{
return new EdistributionDbContext(GetSchemaName());
}
}
4) Ho anche configurato migrazione Storia Tavolo da collocare entro corretto schema:
public class EdistributionDbConfiguration : DbConfiguration
{
public EdistributionDbConfiguration()
{
SetDefaultHistoryContext((connection, defaultSchema)
=> new HistoryContext(connection, GetSchemaName()));
}
}
5) ho modificato il codice generato per le migrazioni per sostituire nome dello schema hardcoded. Per esempio. Ho sostituito CreateTable("IPR_TEST.Users")
con CreateTable($"{_schema}.Users")
. (Il campo _schema
viene impostato in base al valore in Web.config).
6) Uso l'inizializzatore del database MigrateDatabaseToLatestVersion<EdistributionDbContext, MigrationsConfiguration>()
.
Avere tutto questo set up, ho ancora problemi quando passo a diverso schema (ad esempio tramite web.config trasformazione.) - viene generata un'eccezione che mi diceva che database non corrisponde il mio modello e AutomaticMigrations sono disabilitate (che è desiderato). Quando provo ad eseguire add-migration
una nuova migrazione viene generato in cui tutti gli oggetti deve essere spostato in diversi schemi (es. MoveTable(name: "IPR_TEST.DistSetGroups", newSchema: "IPR");
, che non è sicuramente desidera
Per me sembra che il nome dello schema è hard-wired da qualche parte in stringa del modello -hash in classe migrazione (ad es 201509080802305_InitialCreate.resx.), vale a dire:
<data name="Target" xml:space="preserve">
<value>H4sIAAAAAAAEAO09227jO... </value>
</data>
e c'è un modo come dire Codice prime migrazioni di ignorare nome dello schema
Sono sicuro di averlo provato, ma con il server SQL, se semplicemente non si specifica lo schema nei collegamenti del modello, si utilizza solo lo schema predefinito per l'utente. –
Grazie @Ben, il tuo commento potrebbe portare a una soluzione del mio problema. Quando ometti 'modelBuilder.HasDefaultSchema (" SCHEMA_NAME ");' Entity Framework imposta "dbo" come schema predefinito. Comunque, ora ho provato 'modelBuilder.HasDefaultSchema (string.Empty);' e sembra che ora lo schema predefinito per l'utente sia (correttamente) usato. Purtroppo, 'Oracle.ManagedDataAccess.EntityFramework.OracleMigrationSqlGenerator' che viene utilizzato per generare SQL per le migrazioni ha problemi con' string.Empty'-schema-name e genera eccezioni durante la generazione di SQL di migrazione ... Ma questo è un altro problema ... –
Ciao Jan Palas, hai trovato qualche soluzione su questo problema? Ho esattamente lo stesso problema, utilizzo EF Migration con Oracle e quando cambio lo schema, tutti gli script di migrazione contengono MoveTable ... – toregua