public void Restore(DatabaseRestoreRequest request, PercentCompleteEventHandler percentCompleteDelegate)
        {
            var server = new Server(request.TargetInstance);
            Database database = server.Databases[request.TargetDatabase];

            // Start by locking down the database
            database.DatabaseOptions.UserAccess = DatabaseUserAccess.Single;
            database.Alter(TerminationClause.RollbackTransactionsImmediately);

            var restoreDb = new Restore { Database = database.Name, Action = RestoreActionType.Database };

            //Specify whether you want to restore database or files or log etc
            restoreDb.Devices.AddDevice(request.FullBackupFile, DeviceType.File);

            // For now we only support database replacement.
            restoreDb.ReplaceDatabase = true;

            // For full backup no recovery is not usefull. Will need to to change this if support for restoring transactional backup file happens.
            restoreDb.NoRecovery = false;

            // Associate the correct physical path for each file to be restored
            foreach (FileToRestore fileToRestore in request.FilesLists)
            {
                restoreDb.RelocateFiles.Add(new RelocateFile(fileToRestore.BackupLogicalName,
                                                             fileToRestore.TargetPhysicalPath));
            }

            if (percentCompleteDelegate != null)
            {
                restoreDb.PercentComplete += percentCompleteDelegate;
            }

            // Magic!
            restoreDb.SqlRestore(server);

            restoreDb.SqlRestoreAsync(server);

            // After the restore, ensure the recovery model is set to simple.
            // Since we only support DEV/TEST/DEMO, we dont want the overhead of the other recovery models.
            database.RecoveryModel = RecoveryModel.Simple;
            database.Alter();

            string sqlConnectionString = string.Format("Integrated Security=SSPI;Persist Security Info=True;Initial Catalog={1};Data Source={0}", server.Name, database.Name);

            foreach (var script in request.ScriptsToExecute)
            {
                var fileInfo = new FileInfo(script);


                string sql;

                using (var text = fileInfo.OpenText())
                {
                    sql = text.ReadToEnd();
                    text.Close();
                }


                SqlConnection connection = new SqlConnection(sqlConnectionString);
                Server srv = new Server(new ServerConnection(connection));
                srv.ConnectionContext.SqlExecutionModes = SqlExecutionModes.ExecuteAndCaptureSql;
                srv.ConnectionContext.ExecuteNonQuery(sql);
            }

        }
        private static void FinishRestore(DatabaseRestoreRequest request, Database database, Server server)
        {

            // After the restore, ensure the recovery model is set to simple.
            // Since we only support DEV/TEST/DEMO, we dont want the overhead of the other recovery models.
            database.RecoveryModel = RecoveryModel.Simple;
            database.Alter();

            string sqlConnectionString =
                string.Format("Integrated Security=SSPI;Persist Security Info=True;Initial Catalog={1};Data Source={0}",
                              server.Name, database.Name);

            foreach (var script in request.ScriptsToExecute)
            {
                var fileInfo = new FileInfo(script);


                string sql;

                using (var text = fileInfo.OpenText())
                {
                    sql = text.ReadToEnd();
                    text.Close();
                }


                SqlConnection connection = new SqlConnection(sqlConnectionString);
                Server srv = new Server(new ServerConnection(connection));
                srv.ConnectionContext.SqlExecutionModes = SqlExecutionModes.ExecuteAndCaptureSql;
                srv.ConnectionContext.ExecuteNonQuery(sql);
            }
        }
        private static void RestoreWasCompleted(TaskCompletionSource<string> tcs, ServerMessageEventArgs args, DatabaseRestoreRequest request, Database database, Server server)
        {
            try
            {
                // God knows why if a backup successfuly completed the SqlError object is set with a success message and a code 3014.
                if (args.Error != null && args.Error.Number != 3014)
                {
                    tcs.TrySetException(new SqlExecutionException(args.Error.Message));
                }
                else
                {
                    // Execute additional action after the restore was completed
                    FinishRestore(request, database, server);

                    //Task completed!
                    tcs.TrySetResult(args.ToString());
                }
            }
            catch (Exception ex)
            {
                tcs.TrySetException(ex);
            }
        }
        public Task<string> RestoreAsync(DatabaseRestoreRequest request, PercentCompleteEventHandler percentCompleteDelegate)
        {



            var server = new Server(request.TargetInstance);
            Database database = server.Databases[request.TargetDatabase];

            // Start by locking down the database
            database.DatabaseOptions.UserAccess = DatabaseUserAccess.Single;
            database.Alter(TerminationClause.RollbackTransactionsImmediately);

            var restoreDb = new Restore { Database = database.Name, Action = RestoreActionType.Database };

            //Specify whether you want to restore database or files or log etc
            restoreDb.Devices.AddDevice(request.FullBackupFile, DeviceType.File);

            // For now we only support database replacement.
            restoreDb.ReplaceDatabase = true;

            // For full backup no recovery is not usefull. Will need to to change this if support for restoring transactional backup file happens.
            restoreDb.NoRecovery = false;

            // Associate the correct physical path for each file to be restored
            foreach (FileToRestore fileToRestore in request.FilesLists)
            {
                restoreDb.RelocateFiles.Add(new RelocateFile(fileToRestore.BackupLogicalName,
                                                             fileToRestore.TargetPhysicalPath));
            }

            if (percentCompleteDelegate != null)
            {
                restoreDb.PercentComplete += percentCompleteDelegate;
            }


            var tcs = new TaskCompletionSource<string>();


            //Handle the Complete event with a TaskCompletionSource that way when can control when the task is completed.
            restoreDb.Complete += (sender, e) => RestoreWasCompleted(tcs, e, request, database, server);

            try
            {
                // Start asynchrounos restore. That way the ThreadPool is not blocked,
                restoreDb.SqlRestoreAsync(server);
            }
            catch (Exception ex)
            {
                // An exception occured. notify the task
                tcs.TrySetException(ex);
            }

            return tcs.Task;
        }