Ошибка произойдет, если вы пытаетесь получить Родителя для сущности, когда у него фактически нет Родителя. Все, что вы указали, прекрасно, и я много раз реализовывал подобные отношения.
Вы упомянули исключение, но не упомянули, когда оно произошло. Во время обновления? Возможно, есть нарушение ФК? Во время вставки? Или просто запрос?
Task.Parent.Parent.Parent.Parent - это не то, что вы можете делать бесконечно. Конечно, он скомпилируется, код не знает, что есть данные, поддерживающие этот оператор. Но во время выполнения каждый вызов .Parent должен соответствовать эквивалентному столбцу ParentID.