Ich habe jetzt gelernt, wie EF für eine Woche oder so zu verwenden, und bin auf dem Problem der Erstellung/Aktualisierung meiner Datenbank fest. Ich bin in der Lage einen Initialisierer erstellen, um die Datenbank zu erstellen, wenn sie nicht da ist:Wie Initialisierer zum Erstellen und Migrieren von MySQL-Datenbank erstellen?
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
}
}
Oder ich kann eine Konfiguration erstellen, um die 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)
{
}
Jeder arbeitet korrekt zu migrieren, aber ich habe nicht gedacht, einen Weg, beides zu tun. Ich kann zwischen den beiden Initialisierern wechseln, indem ich den SetInitializer-Aufruf ändere, aber wenn ich die Datenbank erstellen möchte, wenn sie nicht da ist, und sie auch migrieren, wenn es das ist, was soll ich tun? Muss ich einen benutzerdefinierten Initialisierer erstellen?
Dank
bearbeiten basierend auf NSGaga
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)
{
}
}
und
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)
{
}
}
und
antwortenclass 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)");
}
}
und schließlich
static void Main()
{
Database.SetInitializer<GumpDatabase>(new GumpDatabaseInitializer());
Würdest du zufällig wissen, wo du die Quelle für EF 4.3.1 finden kannst? Die Microsoft-Site hat nur 5 oder 6. – Matt
Ich denke, sie sind "Open Source" nur für neue Updates (d. H. EF 6) gegangen - aber die Quelle sollte das gleiche sein - in Bezug auf diese zumindest. Wenn Sie 'DbMigrator' haben, ist es so ziemlich – NSGaga
Es sieht so aus, als gäbe es einige fehlende Teile:' using System.Data.Entity.Config; mit System.Data.Entity.Internal; mit System.Data.Entity.Resources; mit System.Data.Entity.Utilities; 'in EF 4.3.1 nicht gefunden. – Matt