2010-09-03 5 views
3

Cela devrait être assez simple.Problème de mise en cache LINQ to SQL

Je LINQ to SQL (C# 3.5/SQL Server) fonctionne bien, avec une relation simple entre deux tables Conférences et ConferenceAttendees.

Je l'ai déjà créé et engagé une Conférence, puis ajouter 3 ConferenceAttendees en utilisant le code suivant (répété 3 fois):

fonctionne très bien et je vois les apparaissent 3 nouveaux participants dans la base de données.

MISE À JOUR: Puis, en utilisant une nouvelle marque datacontext, je les opérations suivantes:

string Names = String.Empty; 
Conference RequestedConference = db.Conferences.FirstOrDefault(x => x.ConferenceId == ConferenceID); 
    foreach (ConferenceAttendee Attendee in RequestedConference.ConferenceAttendees) 
     Names += Attendee.Name + ", "; 

Mais il n'a pas de participants connexes qui s'y rattachent! (Ils existent définitivement dans la base de données et ont été validés). Mais RequestedConference.ConferenceAttendees a toujours un compte de 0 si la boucle est jamais entré ..

foreach (ConferenceAttendee Attendee in this.ConferenceAttendees) 
{ Names += Attendee.Name; } 

Je fais cela à l'intérieur d'une conférence partielle de classe, avec une méthode que je l'ai fait appelé PrintAllAttendeeNames(). Qu'est-ce que je fais mal et pourquoi ce nouveau contexte de données ne voit-il pas facilement ces objets liés via LINQ lorsqu'ils sont déjà engagés dans la base de données?

(Note: Je l'ai déjà essayé d'appeler

db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 

en vain ..)

Un grand merci

CONFESSION MISE À JOUR

Je suis un crétin absolu. J'avais l'installation de dataContext comme statique. Je ne fais jamais ça normalement, c'est pourquoi je n'ai jamais de problèmes de chargement paresseux.

J'ai eu ceci:

public static MyDataContext db = new MyDataContext(ConfigurationManager.ConnectionStrings["MyDBConnection"].ConnectionString); 

Bien sûr, changer à cette résolu le problème !!!

public MyDataContext db = new MyDataContext(ConfigurationManager.ConnectionStrings["MyDBConnection"].ConnectionString); 

Répondre

1

Un couple de choses. D'abord, vous devriez seulement soumettre vos changements quand vous avez fait tous les changements. Vous n'avez pas besoin d'appeler SubmitChanges chaque fois que vous créez un nouveau participant. Créez les trois premiers, InsertOnSubmit chacun, puis faites un seul appel au SubmitChanges. LINQ to SQL génère des appels plus efficaces et plus volumineux de cette façon. Deuxièmement, je suis un peu confus au sujet du problème de chargement des participants. Ils devraient charger paresseux sur le premier accès de la propriété Attendee. Chaque conférence individuelle encourrait une requête distincte lorsque sa propriété est accédée pour la première fois, ce n'est donc pas la manière la plus efficace de la gérer. Vous pouvez indiquer à L2S de pré-charger tous les participants pour chaque objet de conférence que vous chargez.Vous le feriez avec la classe DataLoadOptions:

using (var context = new SomeContext(...)) 
{ 
    var options = new DataLoadOptions(); 
    options.LoadWith<Conference>(c => c.ConferenceAttendees); 

    context.LoadOptions = options; 

    var conferencesWithAttendees = from c in context.Conferences 
            where c.Year = DateTime.Now.Year 
            select c; 

    foreach (var conferenceWithAttendee in conferencesWithAttendees) 
    { 
     conferenceWithAttendee.PrintAllAttendeeNames(); 
    } 
} 
+0

Merci pour le premier point, bon à savoir et je ferai dorénavant. J'ai toujours des problèmes. Oui, le chargement paresseux fonctionne normalement bien pour moi aussi. Ça doit être quelque chose de vraiment simple! Voir ci-dessus: J'ai mis à jour pour expliquer le code que j'utilise pour charger dans la conférence et itérer à travers les participants. Mais le compte est toujours 0! – Aaron

+0

Je suis un crétin. J'ai déclaré le dataContext comme statique !!! GRRR !!! Un grand merci pour votre aide et désolé de perdre votre temps. 1 point. – Aaron

+0

De manière générale, un DataContext ne doit JAMAIS rester plus longtemps que le temps nécessaire pour effectuer un travail. Le DataContext est une unité de classe de travail, ce qui en fait un champ ou une propriété d'une classe est une mauvaise idée. Créez le plus tard possible, éliminez le plus tôt possible et créez une nouvelle instance chaque fois que vous travaillez dans une unité. – jrista