Please post the stack trace.
Anyway I guess you should take the methods which returns the collections out of the for loops, because the way it's written will not get you out of the loop, every time a collection is returned and the first entity is accessed without any advance (endless loop).
Could you please try te following code instead:
protected void Validate(IEntity2 entity)
{
entity.Validate();
EntityCollectionBase2 col1 = (EntityCollectionBase2)entity.GetDependentRelatedEntities();
foreach (IEntity2 e in col1)
{
Validate(e);
}
// The same idea for the rest of the loops.
}