Заголовочный файл будет включен один раз на единицу перевода, да. Он может быть включен несколько раз для каждой программы, поскольку каждый блок перевода обрабатывается отдельно для процесса компиляции. Они объединяются в процессе связывания, чтобы сформировать законченную программу.
Удаление на уровне базы данных не является идеальным решением в данном случае case DataContext ничего не знает о том, что объекты уже удалены. Лучше всего справиться с ситуацией на уровне приложения, используя флаги ассоциации, такие как [Association (... DeleteRule = "cascade" ...)].
у вас есть 2 пути, которые я знаю, для него