2011-01-14 3 views
0

J'ai une application Web. Il fait une tonne de données lues sur de petites tables et quelques écritures. Je veux mettre en cache des tables entières de données et interroger les données mises en cache. Je remplace la méthode Table <T>() du contexte afin que nous puissions servir le cache au lieu de données en direct. Fonctionne très bien pour les insertions et prend également en charge l'accès aux données de test unitaire. Impressionnant.Mise en cache des données Linq2Sql

Nous avons donc commencé à utiliser des données de cache et découvert que les mises à jour et les suppressions ne fonctionnaient pas.

Nous tirons un objet de DB, le jetons dans une liste <T>, mettons cette liste dans le httpCache, puis déposez le contexte de données.

Deux demandes plus tard, nous appelons la table <T> remplacée, il obtient la liste, et tire l'objet. Nous le changeons, puis nous devons rattacher l'objet mis en cache, puis modifié au contexte db. Nous appelons donc myContext.Attach (myobject) et ..... BOOM

Une tentative a été faite pour attacher ou Ajouter une entité qui n'est pas nouvelle, peut-être avoir été chargé d'un autre DataContext. Ce n'est pas supporté.

Y a-t-il un moyen de contourner cette limitation?

Répondre

1

Il semble que vos entités mises en cache sont toujours attachées au DataContext original avec lequel elles ont été interrogées. Un moyen de contourner ce problème (qui viole la règle des meilleures pratiques pour maintenir le cycle de vie DataContext court) est de mettre en cache le DataContext avec vos entités, puis d'utiliser ce contexte mis en cache lorsque vous souhaitez supprimer ou mettre à jour les entités mises en cache. Vous mentionnez que les entités mises en cache sont utilisées «deux demandes plus tard». Si ces demandes se produisent toutes dans un court laps de temps, la rupture de la règle du cycle de vie court peut ne pas poser de problème.

Une autre option est d'objets de cache qui sont basés sur entités, mais qui ne sont pas entités, et quand il est temps de mettre à jour des entités avec des valeurs stockées dans les objets non-entité mises en cache, la requête des entités propres sur un nouveau DataContext , mettez à jour ces entités et enregistrez-les ensuite sur le DataContext nouvellement créé.

Il y a encore d'autres façons de le faire - J'ai trouvé le livre LINQ in Action très utile pour traiter des cas comme ceux-ci.

+0

Je marque ceci comme réponse parce que "LinqToSql ne supporte pas ceci" * est * la réponse. –

Questions connexes