public static int Main(string[] args)
        {
            // process the command line arguments
            ArgumentsHelper.BuildArgumentsDictionary(args);

            if (ArgumentsHelper.ContainsKey(CommandLineParameters.Help))
            {
                OutputHelper.ShowHelpOutput();
                return(OutputHelper.Exit(MessageFactory.Get(MessageType.Success)));
            }

            ConfigurationHelper.SetAppConfig(ArgumentsHelper.Get(CommandLineParameters.AppConfigPath));

            var error = EntityFrameworkHelper.LoadEntityFramework(ArgumentsHelper.Get(CommandLineParameters.EntityFramework));

            if (error != null)
            {
                return(OutputHelper.Exit(error));
            }

            // get the target migration
            var targetMigration = ArgumentsHelper.Get(CommandLineParameters.TargetMigration);
            var showScript      = ArgumentsHelper.ContainsKey(CommandLineParameters.Script);
            var scriptPath      = ArgumentsHelper.Get(CommandLineParameters.ScriptPath);

            var dependencies =
                MigrationHelper.LoadDependencies(ArgumentsHelper.Get(CommandLineParameters.EntityFramework),
                                                 ArgumentsHelper.Get(CommandLineParameters.DependentDlls));

            AppDomain.CurrentDomain.AssemblyResolve +=
                (sender, eventArgs) => dependencies.FirstOrDefault(x => x.FullName == eventArgs.Name);

            var assembly = MigrationHelper.LoadAssembly(ArgumentsHelper.Get(CommandLineParameters.DllPath), out error);

            if (error != null)
            {
                return(OutputHelper.Exit(error));
            }

            var context = MigrationHelper.GetContextFromAssembly(ArgumentsHelper.Get(CommandLineParameters.ContextName), assembly, out error);

            if (error != null)
            {
                return(OutputHelper.Exit(error));
            }

            var connectionStringName = ArgumentsHelper.Get(CommandLineParameters.ConnectionStringName);
            var connectionString     = ConfigurationHelper.GetConnectionString(ArgumentsHelper.Get(CommandLineParameters.ConnectionString),
                                                                               connectionStringName);

            var provider = ConfigurationHelper.GetProvider(ArgumentsHelper.Get(CommandLineParameters.Provider),
                                                           connectionStringName);

            if (string.IsNullOrEmpty(connectionString))
            {
                return(OutputHelper.Exit(MessageFactory.Get(MessageType.MissingConnectionString)));
            }

            var config =
                MigrationHelper.GetConfigurationInstance(ArgumentsHelper.Get(CommandLineParameters.Configuration),
                                                         assembly, context, connectionString, provider, out error);

            if (error != null)
            {
                return(OutputHelper.Exit(error));
            }

            var migrationResult = MigrationHelper.DoMigration(config, targetMigration,
                                                              ArgumentsHelper.ContainsKey(CommandLineParameters.Info), showScript, scriptPath,
                                                              connectionString, provider);

            return(OutputHelper.Exit(migrationResult));
        }