Cóż, po skontaktowaniu się z pomocą techniczną Microsft udało mi się, że działa poprawnie, ale jest powolny i mniej lub bardziej bezużyteczny. Wykonywanie kopii zapasowej, a następnie przywracanie jest znacznie szybsze i będę z niego korzystać tak długo, jak nowa kopia powinna znajdować się na tym samym serwerze, co oryginał.
Działający kod wygląda następująco:
ServerConnection conn = new ServerConnection("rune\\sql2008");
Server server = new Server(conn);
Database newdb = new Database(server, "new database");
newdb.Create();
Transfer transfer = new Transfer(server.Databases["source database"]);
transfer.CopyAllObjects = true;
transfer.CopyAllUsers = true;
transfer.Options.WithDependencies = true;
transfer.DestinationDatabase = newdb.Name;
transfer.DestinationServer = server.Name;
transfer.DestinationLoginSecure = true;
transfer.CopySchema = true;
transfer.CopyData = true;
transfer.Options.ContinueScriptingOnError = true;
transfer.TransferData();
Sztuczka polegała na ustawieniu właściwości DestinationDatabase. Należy to ustawić, nawet jeśli cel jest taki sam jak źródło. Ponadto musiałem połączyć się z serwerem jako nazwana instancja zamiast korzystać z innych opcji połączenia.