2009-12-16 5 views
1

Prenons l'exemple suivant:Quand puis-je disposer de mon DataContext?

MyDataContext context = new MyDataContext(); // DB connection established. 
MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity 

Dis mon entité a des relations avec d'autres tables que j'accès via

foreach (var record in MyEntity.RelatedTable)

Ai-je besoin de garder mes DataContext en vie après la 2ème ligne pour accéder aux propriétés des entités ou est-il suffisamment sûr pour en disposer? Je comprends que Linq to SQL utilise l'exécution différée. Je me demande si elle n'utilise que l'exécution différée lorsque vous récupérez initialement l'entité ou si elle l'utilise lors de l'accès aux enregistrements de la table associée.

Exemple

var userRepo = new UserRepository(); // creates new DataContext 
var auditRepo = new AuditRepository(); // creates new DataContext 
var activeUsers = userRepo.FindActiveUsers(); 
foreach (var user in activeUsers) 
{ 
    // do something with the user 
    var audit = new Audit(); 
    audit.Date = DateTime.Now; 
    audit.UserID = user.ID; 
    auditRepo.Insert(audit); 
} 

Ma méthode d'insertion dans mes appels repo SubmitChanges. Ainsi est-ce acceptable ci-dessus, ou est-ce une perte de connexion. Devrais-je faire de manière réaliste:

var userRepo = new UserRepository(); 
var activeUsers = userRepo.FindActiveUsers(); 
foreach (var user in activeUsers) 
{ 
    // do something with user 
    var audit = new Audit(); 
    audit.Date = DateTime.Now; 
    audit.UserID = user.ID; 
    user.Audits.Add(audit); 
    userRepo.Save(); 
} 

Pour réutiliser le DataContext déjà ouvert? Que feriez-vous dans des situations où vous ouvriez un datacontex de haut niveau et que vous deviez ensuite effectuer un traitement de bas niveau, devrais-je transmettre l'userRepo ou devrais-je créer un référentiel séparé?

Répondre

4

Pour accéder aux champs d'autres tables, vous devez conserver le DataContext actif. Aussi, n'appelez pas directement, utilisez le mot-clé using.

using (MyDataContext context = new MyDataContext()) // DB connection established. 
{ 
    MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity 

    foreach (var record in MyEntity.RelatedTable) 
    { 
     ... 
    } 
} 
+0

Est-il toujours conseillé d'utiliser une déclaration using en traitant des repos? J'ai créé des référentiels personnalisés que j'utilise et parfois cela ne semble pas une bonne idée d'emballer tout mon code dans l'utilisation des instructions – James

+1

Vous voulez dire que vous avez un code écrit personnalisé sur lequel vous seul travaillez et vous pouvez garantir qu'il ne fonctionne pas conserver des ressources plus longtemps que nécessaire si vous omettez l'appel Dispose, et ne le fera jamais dans le futur? Alors dans votre situation, je suppose que c'est OK de ne pas appeler en utilisant.Mais en général, il est recommandé d'appeler en utilisant n'importe quel objet qui implémente IDisposable. Vous ne ferez rien si vous ne le faites pas: le garbage collector nettoiera les objets non-exposés qui ne sont pas visibles. Mais vous ne savez pas quand le garbage collector fonctionnera, si jamais. –

+1

Ouais bon point Mark, merci. – James

3

Vous n'avez pas besoin de disposer du DataContext car il s'agit d'un objet léger et toutes les connexions internes à la base de données sont mises en cache. Si vous en disposez, vous ne pourrez pas accéder aux entités associées.

+0

Alors L2S utilise également l'exécution différée lors de l'accès aux entités associées? – James

+0

Oui, il utilise l'exécution différée sauf si vous utilisez la méthode DataContext.LoadWith – tt83

+0

Merci pour le conseil! Je n'ai jamais réalisé que cette option était disponible – James

Questions connexes