SQL SMO Восстановить файл .bak в локальный экземпляр

Для надежности сначала я локально копирую файл .bak из сети, а затем пытаюсь восстановить его на локальном экземпляре SQL Server. Однако восстановление хочет восстановить файл БД в исходную папку, которая не существует локально. Как я могу указать ему использовать локальный каталог файлов экземпляра SQL по умолчанию?

public void RestoreDB(string file)
{
    try
    {
            SqlConnection sqlConnection = new SqlConnection()
            {
                ConnectionString = $"Data Source=(LocalDB)\\MSSQLLocalDB;User ID=xx;Password=xx"
            };

            ServerConnection serverConnection = new ServerConnection(sqlConnection);

            Server dbServer = new Server(serverConnection);

            Restore restore = new Restore()
            {
                Action = RestoreActionType.Database,
                Database = "DBTest",
                NoRecovery = false,
                ReplaceDatabase = true
            };

            restore.Devices.AddDevice(file, DeviceType.File);

            restore.SqlRestore(dbServer);
        }
    catch (Exception ex)
    {
        throw ex;
    }
}

person user3140169    schedule 28.01.2020    source источник
comment
Для этого потребуется свойство .RelocateFiles, которое, как и большинство вещей SMO, не имеет надлежащей документации (больше?), но этот ответ демонстрирует один возможное использование (которое можно упростить, если вы знаете все задействованные файлы). Насколько я знаю, для этого потребуются абсолютные пути - однако определение пути к данным локального экземпляра является отдельной задачей. Может потребоваться что-то вроде select physical_name from master.sys.database_files.   -  person Jeroen Mostert    schedule 28.01.2020
comment
Я попробовал предложение @JeroenMostert, которое имеет смысл, но '''relocateFile.PhysicalFileName = $@{DBServer.BackupDirectory}{relocateFile.LogicalFileName}.mdf;''' неправильно устанавливает физический путь. Он по-прежнему включает исходный путь плюс мое значение.   -  person user3140169    schedule 28.01.2020
comment
Ну, вы почти наверняка не хотите DBServer.BackupDirectory; это не обязательно будет соответствовать расположению файла базы данных. Помните также, что SMO — это всего лишь довольно тонкая оболочка для фактически выполняемых операторов; вы всегда можете подключить экземпляр Profiler, чтобы увидеть оператор RESTORE, который он на самом деле готовит, если есть какие-либо сомнения (или, если вы достаточно расстроены, вы можете даже написать код, который просто генерирует оператор RESTORE - мой предпочтительный подход, а не использование СМО вообще ни за что :-Р).   -  person Jeroen Mostert    schedule 28.01.2020