W przypadku ilości danych, takich jak 300 tys. wierszy, zapomniałbym EF. Zrobiłbym to, mając stół taki jak:
BatchId RowId
Gdzie RowId to PK wiersza, który chcemy zaktualizować, a BatchId po prostu odnosi się do tego „przebiegu” 300 tys. wierszy (aby umożliwić wiele naraz itp.).
Wygenerowałbym nowy BatchId (może to być cokolwiek unikalnego -Guid, jak na myśl przychodzą mi na myśl) i użyje SqlBulkCopy, aby wstawić te rekordy do tej tabeli, tj.
100034 17
100034 22
...
100034 134556
Następnie użyłbym prostego sproc, aby wykonać połączenie i aktualizację (i usunąć partię z tabeli).
SqlBulkCopy to najszybszy sposób na dostarczenie takiej ilości danych na serwer; nie utoniesz w podróżach w obie strony. EF jest zorientowany obiektowo:fajny w wielu scenariuszach - ale nie w tym.