public static Action <IContainer, MigrationCustomizer> InitializeAndGetMigrator( IContainerSetup s, Func <ISqlConnectionStringProvider> connectionStringProviderFactory, params Assembly[] entitiesOrigin) { s.For <ISqlConnectionStringProvider>().Import.FromFactory(locator => connectionStringProviderFactory()); s.For <IDataModelHelper>().Use <CachedDataModelHelper>(); s.For <ITransactionManager <SqlConnection> >().Use <ConnectionCreator>(); s.For <IDatabase>().Use <Database>(); s.For <ISchemaMigrator>().Use <SchemaMigrator>(); s.For <IEntityNamingConvention>().Use <DefaultEntityNamingConvention>(); foreach (var assembly in entitiesOrigin) { s.ScanAssembly(assembly); } Action <IContainer, MigrationCustomizer> migratorFunc = (container, customizer) => { var sqlScriptGenerator = new SqlMigrationScriptBuilder(); var hashBuilder = new MigrationHashBuilder(); var proxy = new ScriptBuilderProxy(hashBuilder, sqlScriptGenerator); if (customizer != null) { proxy.AddCustomScript(customizer.BeforeMigrationScript, customizer.AfterMigrationScript); } using (var locator = container.GetLocator()) { var migrator = locator.Get <ISchemaMigrator>(); migrator.MigrateStructure(locator, proxy); var hash = hashBuilder.GetHash(); var script = sqlScriptGenerator.ToString(hash); var connectionBuilder = locator.Get <ITransactionManager <SqlConnection> >(); using (var connection = connectionBuilder.Open(false)) { using (var command = new SqlCommand(script, connection.GetConnection())) { command.CommandTimeout = 1000000; command.ExecuteNonQuery(); } connection.Commit(); } if (!string.IsNullOrWhiteSpace(customizer.ScriptsRoot)) { ScriptsMigrator.RunScripts(connectionBuilder, customizer.ScriptsRoot); } } }; return(migratorFunc); }