Lo primero es que no puedes realizar un borrado en cascada en c#. Es un proceso de base de datos, el cual podas provocar desde c#, como mucho.
Tienes varias opciones para este tipo de problemática, las restricciones de integridad referencial:
Puedes establecer en la creación de la relación que exista un borrado en cascada automático.
ALTER TABLE [dbo].USER_PHONE WITH CHECK ADD
CONSTRAINT [FK_Temp_UsersPhone_Users] FOREIGN KEY([USR_ID])
REFERENCES [dbo].[Users] ([USR_ID])
ON DELETE CASCADE
Sacado de http://rudesyle.wordpress.com/2008/01/28/cascading-deletes-in-sql-server/
Es una opción bastante "agresiva" y peligrosa. Imagina que un sql mal construido borra un estado. Con un delete cascade te borraría todos los usuarios con ese estado.
No la recomendaría, en principio.
Otra opción es centralizar el borrado en un procedimiento almacenado o en triggers para sólo en ese caso borrar en orden primero los registros en las tablas que hacen de clave externa y finalmente la principal.
Puedes tratar de hacer algo programático (o buscarlo hecho) que averigüe el orden leyendo la información de Master y borre en ese orden. Pero lleva su tiempo de desarrollo.
Una tercera vía, que suele ser la que uso, es que el borrado no es real, es un borrado "lógico". Tienes un campo "borrado" de tipo bit 0 default. Cuando quieres borrar haces un "Update Tabla set borrado=1, fechaBaja=getdate() where ...". Es una manera de tener histórico además. En las consultas siempre hay que filtrar " where borrado=0" para ver los activos.
¿Usas linq to sql? Porque me parece que entonces es otra guerra :)
Un saludo.