È possibile "dire" alla migrazione come creare un'istanza MyDbContext? Per impostazione predefinita utilizza un costruttore pubblico senza parametri e cerca la stringa di connessione in AppConfig con la stessa classe MyDbContext. Posso dire in qualche modo configurare la migrazione per utilizzare un metodo factory per creare un'istanza MyDbContext, che utilizzerà per la migrazione?
È possibile creare una classe che implementa l' IDbContextFactory<MyDbContext>
e che contenga il codice personalizzato per creare un'istanza di MyDbContext
.
Strumenti di progettazione e strumenti di migrazione scopriranno automaticamente questa classe (se è presente nello stesso assembly di DbContext
) e la useranno per inizializzare MyDbContext
.
public class MigrationsContextFactory : IDbContextFactory<MyDbContext> {
public MyDbContext Create() {
return new MyDbContext(connectionString, someOtherSettings);
}
}
Vedi documentazione per riferimento.
Non so come fare la migrazione usa un costruttore senza parametri del DbContext, ma vorrei usare la mia classe di configurazione e il mio Initializer per iniettare qualche stringa di connessione, per esempio. Forse può aiutarti.
public class MyDbInitializer : IDatabaseInitializer<MyDbContext>
{
private readonly DbMigrationsConfiguration _configuration;
public MyDbInitializer(string connection)
{
_configuration = new Configuration(connection);
}
public void InitializeDatabase(MyDbContext context)
{
if (!context.Database.Exists())
{
context.Database.Create();
}
else
{
var migrator = new DbMigrator(_configuration);
if (migrator.GetPendingMigrations().Any())
migrator.Update();
}
}
}
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
public Configuration(string connectionString)
{
this.TargetDatabase = new System.Data.Entity.Infrastructure.DbConnectionInfo(connectionString);
AutomaticMigrationsEnabled = true;
ContextKey = "MyProj.Models.MyDbContext";
}
}
public MyDbContext()
{
}
public MyDbContext(string connection)
{
Database.SetInitializer(new MyDbInitializer(connection));
}