Pour des volumes de données comme 300 000 lignes, j'oublierais EF. Je ferais cela en ayant un tableau tel que :
BatchId RowId
Où RowId est le PK de la ligne que nous voulons mettre à jour, et BatchId se réfère simplement à cette "série" de 300 000 lignes (pour en autoriser plusieurs à la fois, etc.).
Je générerais un nouveau BatchId (cela pourrait être quelque chose d'unique - Guid me vient à l'esprit), et utiliserais SqlBulkCopy pour insérer les enregistrements dans cette table, c'est-à-dire
100034 17
100034 22
...
100034 134556
J'utiliserais alors un simgle sproc pour faire la jointure et la mise à jour (et supprimer le lot de la table).
SqlBulkCopy est le moyen le plus rapide d'acheminer ce volume de données vers le serveur ; vous ne vous noierez pas dans les allers-retours. EF est orienté objet :idéal pour de nombreux scénarios - mais pas celui-ci.