Como inserir vários registros no banco usando Entity Framework?

Ok, é com SqlBulkCopy. Mas como ele pertence ao ADO.NET dá no mesmo

O Entity Framework (EF) é um ORM da Microsoft que permite a nós, programadores, desenvolver dentro de um modelo conceitual de dados ao invés de programar direto no banco. Desse modo qualquer alteração feita nos dados durante seu uso no sistema deve ser persistida no banco já que isso não é feito automaticamente. No caso do Entity Framework usaríamos o método SaveChanges.

Para funcionar o EF gera um script SQL para cada ação. Assim, se chamarmos o método AddObject para inserir um objeto Pessoa, um INSERT é gerado e enviado ao banco de dados junto com as propriedades do objeto Pessoa.

E quando vamos adicionar 3.000 registros de uma vez?

Nesse caso temos 2 soluções:

  1. Fazemos um loop e jogamos 3.000 INSERTs no banco de dados (não recomendado)
  2. Usamos a classe SqlBulkCopy

Opa, peraê: Quer dizer que não vamos usar o Entity Framework então?

O Entity Framework não tem uma maneira nativa de se fazer um bulk insert. Mas como ele foi construído sobre o ADO.NET não teria problema usarmos o SqlBulkCopy. Isso sem contar o fato que o SqlBulkCopy traz pra gente um ganho considerável de performance com relação aos múltiplos INSERTs.

Veja um exemplo do uso do SqlBulkCopy:

using (SqlConnection destinationConnection = new SqlConnection(connectionString))
{
	destinationConnection.Open();
 
	using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
	{
		bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns";
 
		try
		{
			//O reader é um SqlDataReader que recebeu todos os 3.000 registros anteriormente
			bulkCopy.WriteToServer(reader);
		}
		catch (Exception ex)
		{
			Console.WriteLine(ex.Message);
		}
		finally
		{
			reader.Close();
		}
	}
}

O fato da gente precisar usar o SqlBulkCopy não quer dizer que o Entity Framework é ruim. Digamos que a Microsoft “esqueceu” de adicionar essa feature no EF...