2011-01-02 1 views
10

J'ai une classe d'entité qui est générée automatiquement à partir de mon modèle de base de données. Cette classe hérite du ObjectContext dont inturn hérite de IDisposable.Disposition du contexte d'objet dans l'infrastructure de l'entité 4

J'ai créé un référentiel qui a diverses méthodes qui utilisent une seule instance de l'objet entité pour interagir avec la base de données.

classe générée Auto

public partial class DevEntities : ObjectContext 
{ 
    public const string ConnectionString = "name=DevEntities"; 
    public const string ContainerName = "DevEntities"; 

classe Repository

DevEntities db = new DevEntities(); 

     public Customer GetCustomerByID(int id) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.CustomerId == id); 

     return customers; 
    } 

    public Customer GetCustomerByPasswordUsername(string email, string password) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.Email == email && c.Password == password); 

     return customers; 
    } 

De cela, vous pouvez voir que je fais plusieurs références à l'instance db. Ma question est la suivante: suis-je préférable d'instancier un nouveau DevEntity dans chaque méthode, afin de pouvoir implémenter l'instruction using, et ainsi assurer une mise au rebut correcte, ou est-ce que ma mise en œuvre actuelle est correcte?

Répondre

9

Je voudrais également implémenter IDisposable sur la classe Repository, afin qu'il puisse disposer de ObjectContext. Si vous renvoyez un objet ObjectContext différent à chaque fois, vous pouvez rencontrer des problèmes lors de l'exécution de requêtes entre ces objets, car ceux-ci sont liés à des ObjectContext s différents, ce qui entraînera une exception.

Définition:

public class Repository : IDisposable 
{ 
    DevEntities db = new DevEntities(); 

    public Customer GetCustomerByID(int id) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.CustomerId == id); 

     return customers; 
    } 

    public Customer GetCustomerByPasswordUsername(string email, string password) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.Email == email && c.Password == password); 

     return customers; 
    } 

    public void Dispose() 
    { 
     db.Dispose(); 
    } 
} 

Utilisation:

using(Repository r = new Repository()) 
{ 
    //do stuff with your repository 
} 

Faire cela, votre dépôt prend soin de disposer le ObjectContext après l'avoir utilisé.

+0

Si je faisais cela, je devrais remplacer la méthode d'élimination d'IDisposable je pense? Alors, à quoi cela pourrait-il ressembler? Est-ce qu'il disposerait l'objet et chaque méthode ferait référence à cette méthode, et donc y passerait une instance? – hoakey

+0

Non, vous n'avez pas à le redéfinir, vous implémentez l'interface sur votre référentiel; Vous pouvez maintenant utiliser le référentiel dans l'instruction using pour que la classe soit automatiquement éliminée à la fin de l'utilisation. – Femaref

+0

Désolé pour mon épaisseur, je ne comprends toujours pas comment cela fonctionnerait. Pourriez-vous élaborer un peu plus s'il vous plaît? Merci beaucoup. – hoakey

Questions connexes