与 Roger 相同的解决方案,但在 DbContext 上使用了静态构造函数。下面的完整代码......这允许初始化代码存在于类本身上,并在 DataDbContext 类的第一次实例化时自行调用。
public partial class DataDbContext : DbContext
{
    public DataDbContext()
        : base("name=DefaultConnection")
    {
    }
    static DataDbContext() // This is an enhancement to Roger's answer
    {
        Database.SetInitializer(new DataDbInitializer()); 
        var configuration = new DataDbConfiguration();
        var migrator = new DbMigrator(configuration);
        if (migrator.GetPendingMigrations().Any())
            migrator.Update();
    }
    // DbSet's
    public DbSet<CountryRegion> CountryRegion { get; set; }
    // bla bla bla.....
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        Configuration.ProxyCreationEnabled = false;
        Configuration.LazyLoadingEnabled = false;
        //Configuration.ValidateOnSaveEnabled = false; 
        base.OnModelCreating(modelBuilder);
        modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly()); // Discover and apply all EntityTypeConfiguration<TEntity> of this assembly, it will discover (*)
    }
}
internal sealed class DataDbInitializer : MigrateDatabaseToLatestVersion<DataDbContext, DataDbConfiguration>
{
}
internal sealed class DataDbConfiguration : DbMigrationsConfiguration<DataDbContext>
{
    public DataDbConfiguration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
    protected override void Seed(DataDbContext context)
    {
        DataSeedInitializer.Seed(context); 
        base.Seed(context);
    }
}
internal static class DataSeedInitializer
{
    public static void Seed(DataDbContext context)
    {
        SeedCountryRegion.Seed(context);
        // bla bla bla.....
        context.SaveChanges();
    }
}
internal static class SeedCountryRegion
{
    public static void Seed(DataDbContext context)
    {
        context.CountryRegion.AddOrUpdate(countryRegion => countryRegion.Id,
            new CountryRegion { Id = "AF", Name = "Afghanistan" },
            new CountryRegion { Id = "AL", Name = "Albania" },
            // bla bla bla.....
            new CountryRegion { Id = "ZW", Name = "Zimbabwe" });
        context.SaveChanges();
    }
}
public class CountryRegionConfiguration : EntityTypeConfiguration<CountryRegion> // (*) Discovered by
{
    public CountryRegionConfiguration()
    {
        Property(e => e.Id)
            .IsRequired()
            .HasMaxLength(3);
        Property(e => e.Name)
            .IsRequired()
            .HasMaxLength(50);
    }
}
public partial class CountryRegion : IEntity<string>
{
    // Primary key 
    public string Id { get; set; }
    public string Name { get; set; }
}
public abstract class Entity<T> : IEntity<T>
{
    //Primary key
    public abstract T Id { get; set; }
}
public interface IEntity<T>
{
    T Id { get; set; }
}
我们可以看到 Seed 方法一次又一次地运行.. 我们可以通过检查迁移是否已经退出来避免这种情况,因为在创建数据库时会自动应用迁移.. 然后我们可以重构 DataDbConfiguration 如下...
internal sealed class DataDbConfiguration : DbMigrationsConfiguration<DataDbContext>
{
    private readonly bool _isInitialized;
    public DataDbConfiguration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
        var migrator = new DbMigrator(this);
        _isInitialized = migrator.GetDatabaseMigrations().Any();
    }
    protected override void Seed(DataDbContext context)
    {
        InitializeDatabase(context);
    }
    public void InitializeDatabase(DataDbContext context)
    {
        if (!_isInitialized)
        {
            if (context.Database.Connection.ConnectionString.Contains("localdb"))
            {
                DataSeedInitializer.Seed(context); // Seed Initial Test Data
            }
            else
            {
                // Do Seed Initial Production Data here
            }
        }
        else
        {
            // Do any recurrent Seed here
        }
    }
}