Here is another great app:
VipPimRingTone(6.1.1.0) An Application to assign ringtone based on Category - xda-developers
But it is best used from a storage card (it doesn't need to be installed, just the exe and any previous backup settings files)
Basically it lets you assign a ringtone to a contact by
name or
category and then saves those settings to a file. If you ever have to reflash or whatever it can restore those ringtones to the contacts. I prefer categories, it is less likely to change... even if you have to make a category for each person
It works by scanning the contacts and assigning the ringtone to the contact's ringtone value... it is not a constanly running app, so it uses no resources. If you add more contacts or change the ringtone, you will need to rerun the app so it can make the settings (then have it export the values for ease in restore)
I suggest that you copy your ringtones to a subfolder on the storage card, so the files are always available after a reset (it will allow the ringtone to be assigned from any location)
\storage card\ringtones\ring1.mp3
\storage card\ringtones\ring2.mp3
\storage card\ringtones\ring3.wma
\storage card\ringtones\VipPimRingTone.exe
\storage card\ringtones\VipRT_(date time).vrf (backup file)
Then assuming you have just reflashed or hard reset, you sync your contacts and then run this app to assign your ringtones en mass
This wouldn't be an issue if MS would allow the ringtone value to saved with the contact (like the picture), but that might be a bit too forward thinking for them...