Question

Quelqu'un at-il des informations utiles sur l'utilisation de la méthode .SaveChanges ()?

Je rencontre divers problèmes lorsque j'essaie d'utiliser la méthode .SaveChanges () sur mon objet de contexte de données. Je prends les données d'une source de données existante, crée les objets EntityFramework / DataService appropriés, renseigne ces objets créés avec des données, ajoute ces objets au contexte, puis enregistre ces données en appelant .SaveChanges.

Les scénarios que j'ai créés (et les problèmes qui leur sont associés) sont tels que ... Dans chaque scénario, j'ai une boucle foreach qui prend des données de lignes dans un DataTable et génère les objets, en les attachant à le contexte comme ils vont. (remarque: trois objets "membres" et deux "adresses" associées à un appel SetLink) - il s’agit en réalité d’un outil de conversion permettant de récupérer les données d’un magasin de données et de les transformer en magasin de données exposé par Data. Services.

  • Appelez .SaveChanges () sans aucun paramètre une fois à la fin de la boucle foreach (c'est-à-dire en dehors de la boucle)
    • Erreur OutOfMemory environ 1/3 du chemin (30 000 sauvegardes sur 90 000) - vous ne savez pas exactement comment cela se passe, même si chaque élément de sauvegarde est un appel SQL distinct à la base de données, sur quoi manque-t-il de mémoire?
  • Appelez .SaveChanges () sans aucun paramètre une fois par boucle
    • Cela fonctionne, mais prend absolument pour toujours (8 heures pour 90 000 sauvegardes)
  • Appelez une fois .SaveChanges (SaveChangesOption.Batch) à la fin de la boucle foreach
    • Même erreur OutOfMemory, mais sans enregistrement dans la base de données
  • Appelez .SaveChanges (SaveChangesOption.Batch) une fois par boucle
    • erreur 404 non trouvée
  • Appelez .SaveChanges (SaveChangesOption.Batch) une fois par 10 boucles
    • Erreur 400 Requête incorrecte (occasionnellement)
    • OutOfMemory après plusieurs itérations
  • Un certain nombre de tentatives aléatoires pour créer le contexte une fois par boucle, ou le définir comme variable au début de la boucle ou comme variable membre privée disponible.
    • Résultats différents, impossible à quantifier, aucun résultat vraiment aussi bon

Quelle est la méthode préférée pour appeler .SaveChanges () à partir d'un objet client lors d'un chargement de données volumineux comme celui-ci? Y at-il quelque chose que je ne comprends pas sur le fonctionnement de .SaveChanges ()? Quelqu'un peut-il fournir plus de détails sur la manière d'utiliser cette fonction une fois et sur les éventuelles limitations à la sauvegarde de données via Data Services? Existe-t-il des pratiques recommandées concernant l’appel à la méthode .SaveChanges ()? Existe-t-il une documentation particulièrement intéressante sur l’appel à la méthode .SaveChanges ()?

Était-ce utile?

La solution

Je n'ai pas beaucoup d'expérience dans l'utilisation d'EntityFramework (juste une expérience aléatoire), avez-vous essayé d'appeler .SaveChanges () toutes les n itérations?

Je veux dire quelque chose comme ça:

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

Je sais que c'est moche, mais c'est la première solution possible que j'ai trouvée.

Autres conseils

J'utilise EntityFramework sur un petit projet aussi, donc je suis très intéressé par la question également. Deux questions rapides:    Avez-vous essayé de désactiver la mise en cache des objets de données dans le contexte de données?    Avez-vous essayé de fermer le contexte de données et en avez-vous créé un pendant la boucle pour libérer de la mémoire?

Cordialement

Kenneth

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top