Eh bien, après avoir contacté le support Microsft, je l'ai fait fonctionner correctement, mais c'est lent et plus ou moins inutile. Faire une sauvegarde puis une restauration est beaucoup plus rapide et je l'utiliserai tant que la nouvelle copie résidera sur le même serveur que l'original.
Le code de travail est le suivant :
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();
L'astuce consistait à définir la propriété DestinationDatabase. Cela doit être défini même si la cible est la même que la source. De plus, je devais me connecter au serveur en tant qu'instance nommée au lieu d'utiliser les autres options de connexion.