Für Datenmengen wie 300.000 Zeilen würde ich EF vergessen. Ich würde dies tun, indem ich eine Tabelle wie diese habe:
BatchId RowId
Dabei ist RowId der PK der Zeile, die wir aktualisieren möchten, und BatchId bezieht sich nur auf diesen "Lauf" von 300.000 Zeilen (um mehrere auf einmal zuzulassen usw.).
Ich würde eine neue BatchId generieren (dies könnte etwas Einzigartiges sein - Guid springt mir in den Sinn) und SqlBulkCopy verwenden, um die Datensätze in diese Tabelle einzufügen, dh
100034 17
100034 22
...
100034 134556
Ich würde dann einen einfachen Sproc verwenden, um die Verknüpfung und Aktualisierung durchzuführen (und den Stapel aus der Tabelle zu löschen).
SqlBulkCopy ist der schnellste Weg, diese Datenmenge auf den Server zu bringen; Sie werden nicht in Hin- und Rückfahrten ertrinken. EF ist objektorientiert:nett für viele Szenarien - aber nicht dieses.