Я создал простое консольное приложение, установил EntityFramework из nuget и выполнил команду Enable-Migrations.
Вот код основного:
using(var ctx = new AppDbContext())
{
var persons = ctx.Persons.ToList();
Console.ReadKey();
}
Вот код класса Configuration
internal sealed class Configuration : DbMigrationsConfiguration<AppDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
Console.WriteLine("Configuration: Constructor");
}
protected override void Seed(AppDbContext context)
{
Console.WriteLine("Configuration: Seed");
}
}
Вот часть структуры сущности в app.config:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
Если я запускаю консольное приложение, то выполняется конструктор класса Configuration для миграции. Почему? Я не меняю инициализатор базы данных.
Обновлять
Теперь я попробовал некоторые инициализаторы базы данных и посмотрел, вызывается ли конструктор класса конфигурации. Вот мой результат:
public class AppDbContext : DbContext
{
static AppDbContext()
{
//Database.SetInitializer<AppDbContext>(new CreateDatabaseIfNotExists<AppDbContext>());
// ==> Configuration class constructor called
//Database.SetInitializer<AppDbContext>(new DropCreateDatabaseIfModelChanges<AppDbContext>());
// ==> Configuration class constructor called
//Database.SetInitializer<AppDbContext>(new DropCreateDatabaseAlways<AppDbContext>());
// ==> Configuration class constructor called
Database.SetInitializer<AppDbContext>(null);
// ==> Configuration class constructor is NOT called
}
public IDbSet<Person> Persons { get; set; }
}
Я явно задаю инициализатор базы данных, но вызывается конструктор класса Configuration. Странное поведение.