2008-10-10 10 views
8

¿Alguien tiene alguna buena información sobre el uso del método .SaveChanges()?¿Cuál es la mejor forma de utilizar el método .SaveChanges() en ADO.Net Data Services?

Tengo una variedad de problemas al intentar utilizar el método .SaveChanges() en mi objeto de contexto de datos. Estoy tomando datos de una fuente de datos existente, creando los objetos apropiados EntityFramework/DataService, completando esos objetos creados con datos, agregando esos objetos al contexto y luego guardando esos datos llamando a .SaveChanges.

Los escenarios que he encontrado (y los problemas asociados con ellos) son como tales ... En cada escenario tengo un bucle foreach que toma datos de filas en una DataTable y genera los objetos, adjuntándolos al contexto a medida que avanzan. (nota: tres objetos son un "miembro" y dos "direcciones" conectadas a través de una llamada SetLink): básicamente, esta es una herramienta de conversión para tomar datos de un data store y dar masajes a un data store expuesto por Data Services.

  • .SaveChanges de Llamadas() sin ningún parámetro una vez al final del bucle foreach (es decir, fuera del bucle)
    • error OutOfMemory aproximadamente 1/3 del camino (30.000 de 90.000 salva) - no estoy seguro de cómo está sucediendo eso, ya que cada elemento guardado es una llamada SQL separada a la base de datos, ¿qué hay para quedarse sin memoria?
  • .SaveChanges call() sin ningún parámetro de una vez por bucle
    • Esto funciona, pero tiene absolutamente para siempre (8 horas para 90.000 salva)
  • .SaveChanges de llamadas (SaveChangesOption.Batch) una vez al final del bucle foreach
    • error OutOfMemory mismo, pero sin ningún guarda en la base de datos
  • .SaveChanges de llamada (SaveChangesOption.Batch) una vez al bucle
    • 404 no se encuentra el error
  • .SaveChanges de llamada (SaveChangesOption.Batch) una vez por cada 10 bucles
    • 400 Solicitud error inadecuado (ocasionalmente)
    • OutOfMemory después de un número de iteraciones
  • Una serie de intentos aleatorios para crear el contexto una vez por ciclo, o tenerlo como una variable al comienzo del ciclo o tenerlo como una variable de miembro privado que está disponible.
    • resultados divergentes, incapaz de cuantificar, ninguno realmente tan bueno

¿Cuál es el método preferido de llamar .SaveChanges() de un objeto cliente cuando se hace una carga de datos de gran tamaño como este? ¿Hay algo que no entiendo acerca de cómo funciona .SaveChanges()? ¿Puede alguien proporcionar más detalles sobre cómo una vez debería utilizar esta función y cuáles (si las hay) son las limitaciones para guardar datos a través de los servicios de datos?¿Existen mejores prácticas en torno a la llamada al método .SaveChanges()? ¿Existe alguna documentación particularmente buena sobre la llamada al método .SaveChanges()?

+0

¿Qué "cambios" está implementando? ¿Por qué 90,000 ahorras? Tal vez deberías probar la replicación SQL, si solo estás pasando datos? solo un pensamiento. – D3vtr0n

+0

solo para aclarar, cuando dices "una vez por ciclo" te refieres a una llamada por ciclo * iteración *? – Veverke

Respuesta

3

que no tengo gran experiencia en el uso de ADO.NET Entity Framework (sólo algunas experimento aleatorio), ¿ha intentado .SaveChanges de llamada() cada n iteraciones?

quiero decir algo como esto:

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

Sé que es feo, pero es la primera solución posible que subí.

+0

esto parece ser una de las mejores soluciones disponibles (en particular el uso de la memoria de equilibrio y la velocidad) - parece funcionar mejor cuanto mayor sea el número de iteraciones (hasta que llegue al límite de memoria). todavía no tengo un método definitivo que funcione en todas las situaciones todavía. – ChrisHDog

0

Estoy usando EntityFramework en un proyecto pequeño también, así que estoy muy interesado en la pregunta también. Dos preguntas rápidas: ¿Ha intentado convertir el almacenamiento en caché de los objetos de datos en el contexto de datos? ¿Ha intentado cerrar el contexto de datos y ha creado uno nuevo durante el ciclo para liberar memoria?

Saludos

Kenneth

+0

crear un nuevo contexto durante el ciclo libera memoria lo que ayuda, pero luego hace que los guardados sean más largos (parece que hay algunas mejoras al procesar grupos de elementos más grandes). ¿Cómo se da vuelta una vez el almacenamiento en caché de los objetos de datos? – ChrisHDog

Cuestiones relacionadas