2013-08-05 1 views
3

Je suis aux prises avec le problème suivant.Utilisation de EntityFramework en C# lors de l'utilisation d'entités pendant une longue période

J'ai une base de données avec une table Jobs, qui contient des informations sur les tâches à effectuer. J'ai suivi l'approche Code First de EF 6.0 et créer une classe POCO appelée Job. Je questionne alors la base de données pour l'emploi:

DbSet<Job> receivedJobs; 
using (var context = new MyContext()) 
{ 
    receivedJobs = (from j in context.Jobs 
      select j); 
} 

Avec les reçus mis receivedJobs Je vais donc faire un temps d'optimisation. Si je comprends bien, la durée de vie du contexte ainsi que les ressources que les contrôles de contexte se termine avec le crochet de fermeture de l'instruction using. Un bon design devrait également libérer des ressources à la base de données dès qu'il n'est plus nécessaire.

Ma question est maintenant ce que je devrais faire dans mon cas? Gardez simplement le contexte de base de données en vie jusqu'à ce que j'aie fini ma tâche d'optimisation qui prend du temps. Ou fermez la connexion car elle n'est pas nécessaire jusqu'à la fin de l'optimisation. Mais dans ce dernier cas, qu'est-ce que je fais avec les objets Job, parce que j'aurai alors besoin d'accéder à certaines propriétés de navigation dont je ne peux pas parce que le contexte a été fermé. (Et en passant les données dans les instances de la classe Job ne seront pas modifiées par l'optimisation, donc il n'est pas nécessaire de garder une trace des modifications apportées à ces objets, car il n'y en aura pas)

peut m'aider à comprendre quelle est la conception recommandée dans ce cas.

Meilleures salutations

Répondre

1

Vous devez toujours conserver un contexte pendant le moins de temps possible pour effectuer les opérations. Dans votre cas, il semble que vous ayez besoin du contexte jusqu'à ce que l'optimisation soit effectuée, car vous utilisez certaines de ses méthodes pour naviguer dans le jeu de résultats. Si tel est le cas, alors le contexte devrait être tenu jusqu'à ce que vous n'en ayez pas besoin.

La mauvaise habitude à éviter est de garder un contexte lorsque vous n'en avez pas besoin immédiatement. Vous verrez certaines applications qui créent un contexte erroné au démarrage de l'application et le conserveront pendant la durée de vie de l'application. C'est mauvais et un gaspillage de ressources.

Dans votre cas, mettez le code d'optimisation en place, utilisez le contexte jusqu'à la fin du code, puis relâchez le contexte. Votre déclaration d'utilisation prendra soin de tous les trucs d'élimination désordonnés. Obtenez juste votre code qui a besoin du contexte dans le {} pour l'utilisation et vous devriez être bon pour aller.

+0

Merci pour le conseil. J'ai oublié de mentionner la chose suivante que j'ai ajoutée à mon message original juste après avoir répondu à ma question. Et d'ailleurs les données dans les instances de la classe Job ne seront pas modifiées par l'optimisation, donc il n'est pas nécessaire de garder trace des modifications apportées à ces objets, car il n'y en aura pas " impliquer l'action de l'utilisateur. Même dans ce cas, je devrais garder la connexion ouverte (il pourrait être un certain temps)? – user2653422

1

Altough il ne résoudra pas tous vos problèmes, spécialement ceux de conception, connaissez-vous la fonction « Inclure » qui les propriétés de précharge navigation de vous des emplois? Par exemple, si un des points d'emploi à une liste de tâches grâce à la propriété nommée « Tâches »:

context.Jobs.Include (« Tâches ») // préchargera la propriété Tâches de votre travail. Context.Jobs.Include ("Tasks.AllowedUsers") // va précharger la propriété Tâches de votre travail et la liste AllowedUsers de chaque tâche.

Si vous souhaitez précharger plusieurs propriétés au même niveau, il suffit d'utiliser quelque chose comme:.

context.Jobs.Include ("Tâches") Inclure ("OtherTasksOnJob")

+0

J'ai lu à propos de cette fonction. Mais cela nécessite de charger plus de données de la base de données alors j'ai besoin à ce moment-là. Mais vrai, cela résout le problème. Mais serai-je capable d'utiliser l'ensemble receivedJobs après la fermeture du contexte? – user2653422

+0

Vous pourrez lire les propriétés de navigation reçues + toutes les fonctions de navigation incluses. Vous devrez rouvrir une connexion pour les mises à jour. – sthiers

Questions connexes