Създадох просто конзолно приложение, инсталирах EntityFramework от nuget и изпълних команда Enable-Migrations.
Ето кода на main:
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>
Ако стартирам конзолното приложение, конструкторът на класа конфигурация на миграциите се изпълнява. Защо? Не променям инициализатора на базата данни.
Актуализация
Сега опитах някои инициализатори на бази данни и гледам дали се извиква конструкторът на класа за конфигурация. Ето моят резултат:
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; }
}
Зададох изрично инициализатора на базата данни, но се извиква конструкторът на класа за конфигурация. Странно поведение.