Per volumi di dati come 300.000 righe, dimenticherei EF. Lo farei avendo una tabella come:
BatchId RowId
Dove RowId è il PK della riga che vogliamo aggiornare e BatchId si riferisce semplicemente a questa "corsa" di 300.000 righe (per consentirne più contemporaneamente ecc.).
Genererei un nuovo BatchId (questo potrebbe essere qualcosa di unico - mi viene in mente la guida) e userei SqlBulkCopy per inserire i record su questa tabella, ad es.
100034 17
100034 22
...
100034 134556
Vorrei quindi utilizzare un simngle sproc per eseguire l'unione e l'aggiornamento (ed eliminare il batch dalla tabella).
SqlBulkCopy è il modo più veloce per trasferire questo volume di dati al server; non annegherai nei viaggi di andata e ritorno. EF è orientato agli oggetti:adatto a molti scenari, ma non questo.