Я изучаю, как использовать EF в течение недели или около того сейчас, и я встал на вопрос о создании/обновлении моей базы данных. Я могу создать инициализатор, чтобы создать базу данных, если она не существует:Как создать инициализатор для создания и миграции базы данных 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
}
}
Или я могу создать конфигурацию для миграции БД
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)
{
}
Каждый работает правильно, но я не понял, чтобы сделать то и другое. Я могу переключаться между двумя инициализаторами, меняя вызов SetInitializer, но если я хочу создать базу данных, если ее нет, а также перенести ее, если это то, что я делаю? Нужно ли создавать пользовательский инициализатор?
Благодаря
Редактировать на основе 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)
{
}
}
и
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)
{
}
}
и
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)");
}
}
и, наконец,
static void Main()
{
Database.SetInitializer<GumpDatabase>(new GumpDatabaseInitializer());
Не могли бы вы узнать, где получить источник для EF 4.3.1? У сайта Microsoft только 5 или 6. – Matt
Я думаю, что они пошли «с открытым исходным кодом» только для новых обновлений (т. Е. EF 6), но источник должен быть одинаков - по крайней мере, по крайней мере. Если у вас есть 'DbMigrator', это в значительной степени это – NSGaga
Похоже, что есть некоторые недостающие части:' using System.Data.Entity.Config; с использованием System.Data.Entity.Internal; с использованием System.Data.Entity.Resources; с использованием System.Data.Entity.Utilities; 'не найден в EF 4.3.1. – Matt