Para volumes de dados como 300 mil linhas, eu esqueceria o EF. Eu faria isso tendo uma tabela como:
BatchId RowId
Onde RowId é o PK da linha que queremos atualizar e BatchId apenas se refere a essa "execução" de 300k linhas (para permitir várias de uma só vez etc).
Eu geraria um novo BatchId (isso poderia ser qualquer coisa única -Guid vem à mente) e usaria SqlBulkCopy para inserir os registros nesta tabela, ou seja,
100034 17
100034 22
...
100034 134556
Eu usaria então um sproc simples para fazer a junção e atualização (e excluir o lote da tabela).
SqlBulkCopy é a maneira mais rápida de obter esse volume de dados para o servidor; você não vai se afogar em viagens de ida e volta. EF é orientado a objetos:bom para muitos cenários - mas não este.