2009-09-25 9 views
1

Quelqu'un peut-il s'il vous plaît expliquer ci-dessous pour moi. La première est comment j'appelle la méthode et le second bit est la méthode LINQ.Aidez-moi à comprendre MY`Using` et `DataContext`

Ma curiosité provient du fait que j'obtiens une erreur context si je ne commente pas la partie using.

Pourquoi? Je ne comprends pas complètement using et context's. Et je voudrais mieux comprendre cela.

Guid workerID = new Guid(new ConnectDAL.DAL.Security().GetUserIDByUserLogin(HUD.CurrentUser)); 

     var myMembers = BLLCmo.GetAllMembers(workerID); 
     if (myMembers.Rows.Count != 0) 
     { 
      dgvMyMembers.DataSource = myMembers; 
     } 
     else 
     { 
      var allMembers = BLLCmo.GetAllMembers(); 
      dgvMyMembers.DataSource = allMembers; 
     } 




    internal static CmoDataContext context = new CmoDataContext(); 

    public static DataTable GetAllMembers() 
    { 
     DataTable dataTable; 

     //using (context) 
     //{ 
      var AllEnrollees = from enrollment in context.tblCMOEnrollments 
           select new 
             { 
              enrollment.ADRCReferralID, 
              enrollment.ClientID, 
              enrollment.CMONurseID, 
              enrollment.CMOSocialWorkerID, 
              enrollment.DisenrollmentDate, 
              enrollment.DisenrollmentReasonID, 
              enrollment.EconomicSupportWorkerID, 
              enrollment.EnrollmentDate 
             }; 

      dataTable = AllEnrollees.CopyLinqToDataTable(); 
     //} 
     return dataTable; 
    } 

Répondre

6

Les blocs "using" disposent automatiquement de l'objet que vous utilisez. Puisque vous n'avez pas donné plus de détails sur ce qu'est l'erreur exacte, je parie qu'elle est liée au fait que le "using" disposera de votre "contexte", et plus tard vous essayerez d'utiliser votre contexte de nouveau.

Les contextes de données doivent être utilisés de manière atomique. Ils sont déjà codés en interne pour être efficaces de cette façon, il n'y a généralement aucune raison valable d'en avoir une aussi longue que vous. La raison pour laquelle vous voyez la plupart des exemples qui utilisent un «using» est parce qu'ils ont le contexte de données initialisé immédiatement avant l'utilisation (ou dedans) et n'essaient pas alors de référencer le contexte disposé. En guise de note finale, l'élimination des objets les amène à libérer toutes leurs références de mémoire interne (telles que les connexions ouvertes, les données mises en cache, etc.).

//Our context exists right now ... unless we've already called this method since the app started ;) 
var myMembers = BLLCmo.GetAllMembers(workerID); // Context is disposed at the end of this call 
if (myMembers.Rows.Count != 0) 
{ 
    dgvMyMembers.DataSource = myMembers; //No prob, we didn't call our function again 
} 
else 
{ 
    var allMembers = BLLCmo.GetAllMembers(); // Oops, our context was disposed of earlier 
    dgvMyMembers.DataSource = allMembers; 
} 
+0

Je ne comprends toujours pas. Je comprends que les «usings» disposent de «choses», ce que je ne comprends pas, c'est pourquoi mon indicatif d'appel CARES? J'assimile les données à un DataTable et j'accède seulement au Contexte dans le DAL sur l'appel ainsi je ne comprends pas la partie de «long terme». –

+0

"interne statique CmoDataContext context = new CmoDataContext();" signifie que votre contexte n'est initialisé qu'une seule fois. Vous appelez GetAllMembers() deux fois de suite.La première fois que vous l'appelez, votre contexte a été initialisé et est prêt à partir. la deuxième fois que vous l'appelez, il est disposé. Vos problèmes seraient résolus si vous déplaciez la portée de votre contexte au niveau de la fonction. – JustLoren

+0

Parce que le contexte est statique, la deuxième fois que vous essayez d'y accéder, il est déjà éliminé. D'où l'erreur. –

2

vous obtenez une erreur si vous utilisez using parce que le contexte est disposé la deuxième fois qu'il est appelé par GetAllMembers().

Si vous devez disposer du contexte, je vous suggère de créer un à la volée dans GetAllMembers() au lieu d'avoir un contexte statique. Consultez la documentation de IDisposable et using.

Voici un lien vers un article qui pourrait vous aider avec Lifetime Management of DataContext.

+0

Je pense que vous avez répondu à MA question. Parce que j'ai le 'contexte STATIC' en dehors de la' Method' le deuxième appel n'a pas de 'context'. Correct? –

+0

C'est correct. –

2

J'ai eu ce problème et je ne l'ai pas compris non plus à ce moment-là. Je viens de retirer l'utilisation et cela a fonctionné. Le problème était Lazy Loading. Le DataContext m'a donné une entité, mais plus tard j'ai essayé d'accéder à une propriété d'une entité parente (au sens d'une clé étrangère). Parce que cette entité parente n'a pas été chargée la première fois, elle a essayé de l'obtenir mais le DataContext était parti. J'ai donc utilisé un DataLoadOptions. Si je savais que j'avais besoin d'une entité associée, je l'ai chargée avec l'entité d'origine. Ex: Vous demandez une facture à votre datacontext, mais plus tard vous voulez accéder au nom du client, comme dans facture.NomClient. Le client n'a pas été chargé, le nom n'est donc pas disponible. DataLoadOptions est également important pour les performances, si vous avez besoin de cette entité associée dans une boucle, vous retournerez à la base de données autant de fois que vous bouclez si vous ne préchargez pas l'entité enfant (ou parent).