private void HandleDataSeeding()
{
if (InitializerInfo?.Initializer == null)
{
Log.Debug("Seeding skipped as no initializer available");
return;
}
Log.Information(
"Handling database seeding for {contextType} on {endPointServer}\\{endpointDatabase}",
InitializerInfo.ContextType,
m_Config.Database.ServerName,
m_Config.Database.DatabaseName);
var forcedSeedingDisabled = m_Config.InitializationConfig.DisableForcedSeeding;
if (forcedSeedingDisabled && m_Config.Mode == DeploymentMode.SeedOnly)
{
forcedSeedingDisabled = false;
}
Log.Debug(
"Initailizer ({initializer}) to be used for seeding found for {contextType} on {endPointServer}\\{endpointDatabase}. Disable forced seeding is set to {forcedSeedingDisabled}",
InitializerInfo.Initializer,
InitializerInfo.ContextType,
m_Config.Database.ServerName,
m_Config.Database.DatabaseName,
forcedSeedingDisabled);
if (forcedSeedingDisabled)
{
return;
}
var seederType = InitializerInfo.Initializer.GetType()
.GetGenericArguments()
.SingleOrDefault(at => at.GetInterfaces()
.Any(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof (ISeedData<>)));
if (seederType != null)
{
Log.Information(
"Performing data seeding for {contextType} using seed {seederType} on {endPointServer}\\{endpointDatabase}",
InitializerInfo.ContextType,
seederType,
m_Config.Database.ServerName,
m_Config.Database.DatabaseName);
using (var targetContext = (DbContext) Activator.CreateInstance(InitializerInfo.ContextType))
{
if (InitializerInfo.Initializer != null)
{
// shut off the initializer as we are only doing seeding now (regardless of mode)
Log.Debug("Setting Database Initializer to null before seeding.");
typeof(Database).GetMethod("SetInitializer")
.MakeGenericMethod(InitializerInfo.ContextType)
.Invoke(null, new object[] { null });
}
targetContext.Database.Connection.ConnectionString =
m_ConnectionInfoBuilder.BuildConnectionString(m_Config.Database, m_Config.AuthMode, m_Config.SqlLogin, m_Config.SqlPassword);
var dataSeeder = Activator.CreateInstance(seederType);
seederType.GetMethod("Seed").Invoke(dataSeeder, new object[] {targetContext});
}
}
else
{
Log.Information(
"No seed data specified on {initializer} for {contextType} on {endPointServer}\\{endpointDatabase}",
InitializerInfo.Initializer,
InitializerInfo.ContextType,
m_Config.Database.ServerName,
m_Config.Database.DatabaseName);
}
}