dirtyRecordsForHasManyChange() workaround to avoid calling _dirtyTree()