Bem, depois de entrar em contato com o suporte da Microsft, consegui que funcionasse corretamente, mas é lento e mais ou menos inútil. Fazer um backup e depois uma restauração é muito mais rápido e vou usá-lo enquanto a nova cópia estiver no mesmo servidor que a original.
O código de trabalho é o seguinte:
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();
O truque foi definir a propriedade DestinationDatabase. Isso deve ser definido mesmo que o destino seja o mesmo que a origem. Além disso, tive que me conectar ao servidor como uma instância nomeada em vez de usar as outras opções de conexão.