Comment effacer le cache DataContext sur Linq to Sql

J’utilise Linq to Sql pour interroger une firebase database. J’utilise Linq uniquement pour lire les données de la firebase database et je les modifie par d’autres moyens. (Cela ne peut pas être changé, c’est une ressortingction de l’App que nous étendons, toutes les mises à jour doivent aller à travers son sdk).

C’est bon, mais j’ai des problèmes de cache. En gros, j’interroge une ligne à l’aide de Linq, puis je le supprime par des moyens externes, puis je crée une nouvelle ligne en externe si j’interroge à nouveau cette ligne à l’aide de linq. données (en cache).

Je ne peux pas désactiver le suivi des objects car cela semble empêcher le contexte de données de charger automatiquement les propriétés associées (clés étrangères).

Est-il possible d’effacer le cache DataContex?

J’ai trouvé une méthode sur Internet mais elle ne semble pas sûre: http://blog.robustsoftware.co.uk/2008/11/clearing-cache-of-linq-to-sql.html

Qu’est-ce que tu penses? Quelles sont mes options?

Si vous souhaitez actualiser un object spécifique, la méthode Refresh () peut être votre meilleur pari.

Comme ça:

Context.Refresh(RefreshMode.OverwriteCurrentValues, objectToRefresh); 

Vous pouvez également transmettre un tableau d’objects ou un IEnumerable en tant que deuxième argument si vous devez actualiser plusieurs objects à la fois.

Mettre à jour

Je vois ce dont vous parlez dans les commentaires, dans le réflecteur, vous voyez ce qui se passe à l’intérieur .Refresh ():

 object objectByKey = context.Services.GetObjectByKey(trackedObject.Type, keyValues); if (objectByKey == null) { throw Error.RefreshOfDeletedObject(); } 

La méthode que vous avez liée semble être votre meilleure option. La classe DataContext ne fournit aucun autre moyen d’effacer une ligne supprimée. Les contrôles d’élimination et autres sont à l’intérieur de la méthode ClearCache() … il s’agit simplement de vérifier l’élimination et d’appeler ResetServices() sur le CommonDataServices dessous … le seul effet CommonDataServices serait d’effacer les insertions, les mises à jour ou les suppressions en attente que vous avez. en queue.

Il existe une option supplémentaire: pouvez-vous lancer un autre DataContext pour l’opération que vous exécutez? Cela n’aurait pas de cache … mais cela implique des coûts de calcul. Par conséquent, si l’insertion, la mise à jour et les suppressions en attente ne posent pas problème, je restrais ClearCache() approche ClearCache() .

J’ai fait ce code pour vraiment effacer les entités “cachées”, le détachant.

 var entidades = Ctx.ObjectStateManager.GetObjectStateEnsortinges(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged); foreach (var objectStateEntry in entidades) Ctx.Detach(objectStateEntry.Entity); 

Où Ctx sont mon contexte.

Vous devriez pouvoir simplement actualiser les jeux de résultats utilisant ces objects. Cela ne tirerait pas un ensemble mis en cache, mais renverrait en réalité les résultats finaux. Je sais que cela peut ne pas être aussi facile ou réalisable en fonction de la configuration de votre application …

HTH.