2013-03-07 2 views
1

Je suis actuellement en utilisant Entity Framework pour créer un site Web dans asp.net, et je me demandais quel est le bon moyen d'instancier le Entity Container?Entité framework bonnes pratiques

Actuellement, je fais ce (où MyDB est mon conteneur-cadre de l'entité):

public partial class User : System.Web.UI.MasterPage 
{ 
    private myDb ctx; 
     protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) ctx = new myDb(); 
    } 
} 

Et j'utiliser le contexte dans de nombreuses fonctions.

Mais, sur de nombreux sites, j'ai vu cette façon de le gérer:

using (var ctx = new myDb()) 
{ 
} 

Mais si l'on utilise le second, je dois le mettre dans de nombreuses fonctions de ma classe. Et ainsi ré-instancier le Entity Container.

Quoi de mieux? Pourriez-vous m'expliquer pourquoi c'est mieux, et si les deux sont bons, pourquoi dois-je en utiliser un plus que l'autre dans des cas différents?

+2

Dans votre cas, vous pouvez appeler 'ctx.Dispose(); 'dans l'événement' Page_Unload' et obtient le même effet que 'using (var ctx = new myDb()) {}'. –

+0

Merci pour la réponse. Quels sont les bons cas pour la méthode d'utilisation ainsi? –

+1

'using' fonctionne sur les classes implémentant' IDisposable'. Lorsque le bloc using est terminé, la méthode '.Dispose()' est appelée. Et vous disposez d'un objet pour libérer les ressources et libérer de la mémoire. Pour l'objet de base de données de votre exemple, cela ferme également la connexion à la base de données. –

Répondre

2

Le pratice de disposer Entity Container vient Habitude de disposer des ressources coûteuses comme les connexions SQL à la base de données comme

using (SqlConnection connection = new SqlConnection(connectionString)) 
{} 

Cependant, le Entity Framework est assez intelligent pour ouvrir des connexions que lorsque les requêtes sont exécutées de sorte que le Entity Container ne le fait pas représente une connexion SQL. Il n'y a donc pas de réel avantage dans ce sens, mis à part collecter les ordures un peu plus tôt.

De plus, si vous disposez du contexte, vous ne pouvez pas utiliser le chargement paresseux. Vous devez utiliser les données relatives à la charge avec Include. Plus d'information est ici Entity Framework - Load Reference Keys after disposing entity object context

En résumé, je ne vois aucun désavantage d'un contexte par approche de demande. En revanche, aucun chargement paresseux n'est un inconvénient important pour moi.

1

Je pensais que j'ajouterais plutôt mes commentaires comme réponse.

Dans votre cas, vous pouvez appeler ctx.Dispose(); en cas Page_Unload et obtenir le même effet que

using (var ctx = new myDb()) 
{ 
} 

using travaux sur les cours de mise en œuvre IDisposable. Lorsque le bloc using est terminé, la méthode .Dispose() est appelée. Et vous disposez d'un objet pour libérer les ressources et libérer de la mémoire. L'objet de base de données de votre exemple hérite de DbContext et implémente IDisposable. Lorsque Dispose() est appelé, il ferme également la connexion à la base de données.

Cela sera bien sûr utile si vous avez beaucoup de demandes. Vous ne voulez pas des milliers de connexions ouvertes à la base de données et beaucoup de mémoire occupée. Une chose à vérifier est que si des exceptions non gérées sont levées avant Page_Unload, l'événement unload ne sera pas déclenché et l'objet de base de données ne sera pas éliminé.

Ensuite, il est préférable d'utiliser un using car il appelle toujours .Dispose() sur les objets.