Pergunta

Alguém tem algumas boas informações sobre o uso dos .SaveChanges () Método?

Eu estou experimentando uma variedade de problemas ao tentar usar o método () .SaveChanges no meu objeto de contexto de dados. Estou levando dados de uma fonte de dados existente, criando o EntityFramework apropriada / DataService objetos, povoando esses objetos criados com os dados, adicionando esses objetos para o contexto e, em seguida, salvando que os dados chamando .SaveChanges.

Os cenários que eu vim acima com (e os problemas associados a eles) são os tais ... Em cada cenário Eu tenho um loop foreach que está tomando os dados de linhas em uma DataTable e gerando os objetos, anexando-os a contexto como eles vão. (Nota: três objetos um "membro" e dois "endereços" que estão ligados através de uma chamada SetLink) - basicamente, esta é uma ferramenta de conversão para tirar dados de um repositório de dados e massagem-lo em um armazenamento de dados que é exposto por serviços de dados.

  • .SaveChanges de chamada () sem quaisquer parâmetros de uma vez no fim do ciclo foreach (isto é, fora do loop)
    • erro OutOfMemory cerca de 1/3 do caminho (30.000 fora de 90.000 salva) - não sei como o que está acontecendo embora como cada save item é uma chamada SQL separado para o banco de dados, o que está lá para ficar sem memória em?
  • Chamada .SaveChanges () sem nenhum parâmetro uma vez por ciclo
    • Isso funciona, mas leva absolutamente para sempre (8 horas para 90.000 salva)
  • Chamada .SaveChanges (SaveChangesOption.Batch) uma vez no final do loop foreach
    • O mesmo erro OutOfMemory, mas sem qualquer salva no banco de dados
  • Chamada .SaveChanges (SaveChangesOption.Batch) uma vez por ciclo
    • 404 erro não encontrado
  • Chamada .SaveChanges (SaveChangesOption.Batch) uma vez por 10 voltas
    • 400 Bad Request erro (ocasionalmente)
    • OutOfMemory após uma série de itterations
  • Uma série de tentativas aleatórias para criar o contexto uma vez por ciclo, ou tê-lo como uma variável no início do loop ou tê-lo como uma variável membro privado que está disponível.
    • Resultados diferentes, incapaz de quantificar, nenhum realmente que boa

O que é o método preferido de chamar .SaveChanges () de um objeto cliente ao fazer uma grande carga de dados como este? Existe algo que eu não estou recebendo sobre como (obras .SaveChanges)? Alguém pode fornecer mais detalhes sobre como uma vez deve estar utilizando esta função e que (se houver) são as limitações para salvar dados via Data Services? Há algum melhores práticas em todo o .SaveChanges chamada de método ()? Existe alguma particularmente boa documentação sobre os .SaveChanges () chamada de método?

Foi útil?

Solução

Eu não tenho grande experiência na utilização EntityFramework (apenas algumas experimento aleatório), você já tentou chamar .SaveChanges () a cada n iterações?

Eu quero dizer algo como isto:

int i = 0;
foreach (var item in collection)
{
    // do something with your data
    if ((i++ % 10) == 0)
        context.SaveChanges();
}
context.SaveChanges();

Eu sei que é feio, mas é a primeira solução possível eu vim acima com.

Outras dicas

Eu estou usando EntityFramework em um projeto pequeno, também por isso estou muito interessado na questão também. Duas perguntas rápidas: Você já tentou desligar o cache og os objetos de dados no datacontext? Você já tentou fechar o datacontext e criou um novo durante o ciclo para liberar memória?

Saudações

Kenneth

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top