2009-05-15 7 views
1

J'ai deux tables (Knicks et Knacks) et une vue qui joint les deux tables (PaddyWhacks). Les tableaux ont les champs suivants:Les données de vue SQL ne sont pas correctement mises à jour

Knicks.key, Knicks.data1 

Knacks.fkey, Knacks.data2 

donc la vue CONTIENT:

PaddyWhacks.key, PaddyWhacks.data1, PaddyWhacks.data2 

j'utilise LINQ to SQL pour récupérer la vue plein IQueryable et tout semble bon. Après cela, je prends une ligne de Knicks et le mettre à jour:

Knick k = db.Knicks.Single(row => row.data1 == 5); 
k.data1 = 6; 
db.SubmitChanges(); 

Je sais que la mise à jour est correcte, parce que si je joue un comte() sur Knicks où data1 == 5, le résultat a changé (et je peux coup d'oeil dans la base de données et voir le changement). Cependant, si je à nouveau récupérer Paddywhacks à l'aide:

IQueryable<PaddyWhack> rows = from row in db.PaddyWhacks select row; 

La valeur data1 correspondante est encore 5.

L'application est en cours d'exécution sur un serveur Web hébergé et si j'attends assez longtemps et de revenir pour essayer à nouveau, Je verrai la valeur mise à jour dans la vue IQueryable. Je suppose que quelque chose est en cache et peut-être que LINQ ne retourne pas à la base de données pour récupérer les données. Existe-t-il une fonctionnalité LINQ ou SQL Server dont j'ai besoin pour résoudre le problème?

+0

Ceci est assez effrayant. –

Répondre

1

Je n'utilise pas linqtosql, mais vous avez raison de dire que quelque chose est dans le cache. Une vue est juste une requête "macro", les données sont les données des tables d'origine, donc elle est toujours à jour. J'essaierais d'utiliser une fonction différente de IQueryable() ou créer une nouvelle connexion, puis exécuter la requête.

+0

Mais ne devrait-il pas y avoir un moyen d'effacer les informations en cache lorsque je demande la vue la deuxième fois? J'essaie de ne plus utiliser la vue, mais je ne peux pas le faire tout de suite. –

+1

J'ai fini par créer un nouveau DataContext avant la requête. Jusqu'à présent, cela ne tue pas la performance, mais c'est quelque chose que je surveillerai. –

1

Vous pouvez essayer de rafraîchir les DataContext comme ceci:

dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, rows); 
+0

Je suppose que je voudrais appeler cela juste avant d'émettre une requête LINQ? Ou serait-il suffisant d'appeler Refresh() après avoir utilisé les résultats d'une requête? En d'autres termes, Refresh() met-il immédiatement à jour les données ou les marque-t-il simplement pour les mettre à jour plus tard? –

Questions connexes