Ho imparato a usare EF per una settimana o giù di lì e sono rimasto bloccato sulla questione della creazione/aggiornamento del mio database. Sono in grado di creare un inizializzatore per creare il database se non è lì:Come creare l'inizializzatore per creare e migrare il database mysql?
static class Program
{
static void Main()
{
Database.SetInitializer<GumpDatabase>(new GumpDatabaseInitializer());
....
class GumpDatabaseInitializer : CreateDatabaseIfNotExists<GumpDatabase>
{
public GumpDatabaseInitializer()
{
}
protected override void Seed(GumpDatabase context)
{
context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX Name ON Stations (Name)");
// Other stuff
}
}
o posso creare una configurazione di migrare il db
static class Program
{
static void Main()
{
Database.SetInitializer<GumpDatabase>(new MigrateDatabaseToLatestVersion<GumpDatabase, Configuration>());
....
internal sealed class Configuration : DbMigrationsConfiguration<GumpDatabase>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
}
protected override void Seed(GumpDatabase context)
{
}
Ogni funziona correttamente, ma non ho capito un modo per fare entrambe le cose. Posso passare tra i due inizializzatori cambiando la chiamata SetInitializer ma se voglio creare il database se non c'è e anche migrarlo se è cosa faccio? Devo creare un inizializzatore personalizzato?
Grazie
Modifica sulla base di NSGaga rispondono
class CreateOrMigrateDatabaseInitializer<TContext, TConfiguration> : CreateDatabaseIfNotExists<TContext>, IDatabaseInitializer<TContext>
where TContext : DbContext
where TConfiguration : DbMigrationsConfiguration<TContext>, new()
{
private readonly DbMigrationsConfiguration _configuration;
public CreateOrMigrateDatabaseInitializer()
{
_configuration = new TConfiguration();
}
public CreateOrMigrateDatabaseInitializer(string connection)
{
Contract.Requires(!string.IsNullOrEmpty(connection), "connection");
_configuration = new TConfiguration
{
TargetDatabase = new DbConnectionInfo(connection)
};
}
void IDatabaseInitializer<TContext>.InitializeDatabase(TContext context)
{
Contract.Requires(context != null, "context");
if (context.Database.Exists())
{
if (!context.Database.CompatibleWithModel(throwIfNoMetadata: false))
{
var migrator = new DbMigrator(_configuration);
migrator.Update();
}
}
else
{
context.Database.Create();
Seed(context);
context.SaveChanges();
}
}
protected virtual void Seed(TContext context)
{
}
}
e
internal sealed class Configuration : DbMigrationsConfiguration<GumpDatabase>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
}
protected override void Seed(GumpDatabase context)
{
}
}
e
class GumpDatabaseInitializer : CreateOrMigrateDatabaseInitializer<GumpDatabase,Gump.Migrations.Configuration>
{
public GumpDatabaseInitializer()
{
}
protected override void Seed(GumpDatabase context)
{
context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX Name ON Stations (Name)");
context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX Name ON Sequences (Name)");
context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX StationPartNumber ON StationPartNumbers (StationId,PartNumberId)");
}
}
ed infine
static void Main()
{
Database.SetInitializer<GumpDatabase>(new GumpDatabaseInitializer());
Sapresti dove trovare la fonte per EF 4.3.1? Il sito Microsoft ha solo 5 o 6. – Matt
Penso che siano andati 'open source' solo per i nuovi aggiornamenti (ad esempio EF 6) - ma la fonte dovrebbe essere la stessa - almeno per quanto riguarda questo. Se hai 'DbMigrator' è più o meno lo – NSGaga
Sembra che ci siano alcuni pezzi mancanti:' using System.Data.Entity.Config; using System.Data.Entity.Internal; utilizzando System.Data.Entity.Resources; utilizzando System.Data.Entity.Utilities; 'non trovato in EF 4.3.1. – Matt