64 votes

Le contexte Entity Framework doit-il être mis en utilisant l'instruction?

Le Cadre de l'Entité objet de contexte met en œuvre une méthode dispose() qui "Libère les ressources utilisées par le contexte de l'objet". Que fait-il vraiment? Pourrait-il être une mauvaise chose de toujours mettre en un à l'aide de {} déclaration? J'ai vu qu'il est utilisé à la fois avec et sans l'aide de l'instruction.

Je suis précisément à l'utilisation de l'EF contexte d'un service WCF méthode, créer le contexte, faire du linq et retourner la réponse.

EDIT: me Semble que je ne suis pas le seul à s'interroger sur cette. Une autre question est de savoir ce qui se passe réellement à l'intérieur de la méthode dispose (). Certains disent qu'il ferme les connexions, et certains articles ne dit pas. Quel est le problème?

34voto

Daniel Brückner Points 36242

Si vous créez un contexte, vous devez vous débarrasser plus tard. Si vous devez utiliser l' using déclaration dépend de la durée de vie du contexte.

  1. Si vous créez le contexte d'une méthode et de les utiliser uniquement à l'intérieur de cette méthode, vous devriez vraiment utiliser l' using instruction, car il vous donne la gestion d'exception sans aucun code supplémentaire.

  2. Si vous utilisez le cadre pour une plus longue période - qui est le temps de la vie n'est pas lié par le temps d'exécution d'une méthode, vous ne pouvez pas utiliser l' using déclaration et vous appelez Dispose() vous-même et prendre soin de ce que vous appelez toujours.

Qu'est - Dispose()le faire pour un objet de contexte?

Je n'ai pas regardé le code, mais au moins je exspect la fermeture de la connexion de base de données avec ses sous-jacent ou de sockets toutes les ressources que le mécanisme de transport utilisé.

5voto

Cory House Points 5014

Perpramming Entity Framework : "Vous pouvez soit explicitement supprimer le ObjectContext, soit attendre que le ramasse-miettes effectue le travail."

En bref, bien que l'instruction using ne soit pas requise, il est préférable de savoir si vous avez fini d'utiliser ObjectContext, car la ressource est immédiatement libérée au lieu d'attendre le garbage collection.

4voto

ullmark Points 1875

Puisque vous ne savez pas quand le ramasse-miettes dispose d'un article, il est toujours bon de résumer les objets qui implémentent IDisposable dans un bloc using si vous savez quand vous en avez fini.

3voto

user3556898 Points 1

EF5 et avant version

     using { ...
            // connecction open here.

            ...
            context.Blogs.Add(blog); 
            context.SaveChanges();   // query etc now opens and immediately closes 

            ...
            context.Blogs.Add(blog); 
            context.SaveChanges();   // query etc now opens and immediately closes 
   }
 

EF6 et après version

  using {
        // connecction open here.

        ...
        context.Blogs.Add(blog); 
        context.SaveChanges(); 

        // The underlying store connection remains open for the next operation  

        ...
        context.Blogs.Add(blog); 
        context.SaveChanges(); 

        // The underlying store connection is still open 

   } // The context is disposed – so now the underlying store connection is closed
 

Référence: http://msdn.microsoft.com/en-us/data/dn456849#open5

1voto

John Saunders Points 118808

Toujours, si vous instanciez une classe qui implémente IDisposable, vous êtes alors responsable d'appeler Dispose. Dans tous les cas sauf un, cela signifie un bloc using .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X