2011-07-10 4 views
0

Je travaille actuellement sur une application qui utilise Entity Framework 4.1 (code d'abord) et SQL Server CE 4.0. Une des nouvelles choses que j'aime vraiment de SQL Server CE 4.0 sont les valeurs calculées.Entity Framework 4.1 DatabaseGeneratedOption.Identity Performance

Mais j'ai un problème de performances lors de l'importation d'anciennes données dans mon nouveau système de stockage de données (environ 50000 entrées). C'est ma deuxième implémentation pour cela. La première version utilisait Entity Framework 4.0 et SQL Server CE 3.5. Mais il existe une énorme différence de performance entre ces implémentations. La première implémentation du code prend environ une heure pour importer les entrées, l'autre implémentation quelques minutes seulement.

La plupart du temps est passé dans la méthode SaveChanges. J'ai suivi le problème jusqu'à l'attribut [DatabaseGenerated(DatabaseGeneratedOption.Identity)]. Si j'utilise [DatabaseGenerated(DatabaseGeneratedOption.None)] et implémente ma propre génération de clés (en guise de solution de contournement simple), les performances sont de retour au niveau de la première implémentation.

Est-ce un problème connu? Y a-t-il un moyen de résoudre ce problème de performance? Ou est en train de générer mes propres clés le chemin à parcourir? Gardez un ObjectContext/connexion ouvert pour la durée de vie de votre application.

+0

Voici deux questions/réponses sur les encarts volumineux dans EF 4.1: http://stackoverflow.com/questions/5943394/why-is-inserting-entities-in-ef-4-1-so-slow-compared- to-objectcontext/5943699 # 5943699 et http://stackoverflow.com/questions/5940225/fastest-way-of-inserting-in-entity-framework/5942176#5942176 La clé est principalement de désactiver la détection automatique des changements. Je ne vois pas de relation avec DatabaseGeneratedOption, mais peut-être que ça aide quand même. – Slauma

+0

Désactiver AutoDetectChangesEnabled n'améliore pas vraiment les performances dans mon cas (mais je le fais). L'accélération de ne pas utiliser DatabaseGeneratedOption.Identity est beaucoup plus élevée. – Fox32

Répondre

0

J'ai décidé d'utiliser la méthode "générer ma propre clé" pour contourner le problème. J'ai ajouté les fonctionnalités requises pour la génération de clés à ma classe DBContext.

Si Microsoft change quelque chose sur ce comportement, je repasse en génération automatique.

0

EF n'est pas idéal pour les insertions en vrac, utilisez SqlCeResultSet pour cela pour max perf.

+0

Je garde déjà le DBContext ouvert pour l'ensemble du processus d'importation, mais le fait de créer de petites unités de 500 entrées semble être plus rapide. Le problème est que la première version était assez rapide pour mes besoins. – Fox32

Questions connexes