Invalider/Désactivation de l'Entity Framework cache

Je vois, il y a plenties de question sur EF cache, mais je n'ai pas trouvé encore trouvé de solution à mon problème.

Le droit en question est

Comment puis-je désactiver complètement l'Entity Framework 6 cache? Ou, puis-je dire par programme EF oublier le cache parce que quelque chose est arrivé à des données?

Arrière-plan

D'abord, j'ai hérité une application faite d'un étrange mélange de EF (modèle à définir d'abord les entités) et de la plaine de vieux SQL (pour manipuler des données). Ce que j'ai fait était de refactoriser le code de l'application pour:

  • Faire des requêtes simples (comme GetAll() pour une entité) utilisation EF6 LINQ
  • Laisser complexe de manipulation de données en SQL, en utilisant DbContext.Database.Connection cas de besoin
  • Ajouter Spring.Web de soutien pour permettre la DI et des transactions (pas encore)

Au point actuel, j'ai réorganisé le code de sorte que la fonction principale de l'application (exécution des requêtes SQL complexes sur d'énormes ensembles de données) fonctionne comme il le faisait avant, mais alors recherche entité de domaine manipulation se fait de plus intelligent à l'aide de comme la plupart des Entity Framework que possible

Que la plupart....

L'une des pages que j'ai hérité est une multi-case de la page, je vais vous montrer pour une meilleure compréhension. Je ne vais pas discuter de la précédente implémenteur choix, parce que c'est moins cher pour résoudre mon problème actuel et, plus tard, refactoriser le code de blocage de développement pour une fracture de la fonctionnalité.

C'est l'apparence de la page comme

Invalider/Désactivation de l'Entity Framework cache

Fondamentalement la Controller méthode est la suivante

    [HttpPost]
    public ActionResult Index(string[] codice, string[] flagpf, string[] flagpg, string[] flagammbce, string[] flagammdiv, string[] flagammest,
        string[] flagintab, string[] flagfinanz, string[] flagita, string[] flagest, string pNew){
            Sottogruppo2015Manager.ActivateFlagFor("pf", flagpf);
            Sottogruppo2015Manager.ActivateFlagFor("pg", flagpg);
            Sottogruppo2015Manager.ActivateFlagFor("ammbce", flagammbce);
            Sottogruppo2015Manager.ActivateFlagFor("ammdiv", flagammdiv);
            Sottogruppo2015Manager.ActivateFlagFor("ammest", flagammest);
            Sottogruppo2015Manager.ActivateFlagFor("intab", flagintab);
            Sottogruppo2015Manager.ActivateFlagFor("finanz", flagfinanz);
            Sottogruppo2015Manager.ActivateFlagFor("ita", flagita);
            Sottogruppo2015Manager.ActivateFlagFor("est", flagest);

            return RedirectToAction("Index", new { pNew });
 }

Chaque string[] paramètre est une colonne dans la table. Le ActivateFlagFor méthode exécute deux requêtes dans la séquence

UPDATE table SET --param1-- = 0;
UPDATE table SET --param1-- = 1 where id in (--param2--)

Lorsque le cache des coups de pied dans

Suivant est le comportement:

  • J'ai d'abord charger la page de l'émission d'un select de LINQ: contrôles de match les uns et de zéros dans les colonnes
  • - Je modifier un ou plusieurs contrôles et de soumettre
  • Le contrôleur questions les requêtes de mise à jour vérifie dans la base de données
  • Avant rediriger (!nouvelle demande!) pour recharger la page, je vérifie la DB et les changements sont appliqués
  • Le rechargement de la page émission de la même LINQ sélectionner ci-dessus: vieux contrôles sont affichés

Je suis sûr que c'est un problème de mise en cache, car le rechargement de l'application résout le problème.
Depuis la caractéristique principale de l'application est totalement SQL base, les changements de tables de recherche sont reflétées dans la principale opération et c'est le bon comportement.

Je comprends que EF de la mise en cache est une grande fonctionnalité pour les performances, mais dans mon cas, je ne veux pas de ça, au moins jusqu'à ce que je migrer l'ensemble de l'application de LINQ DML (probablement impossible).

Comment j'utilise le DbContext

Bien sûr, certains d'entre vous peuvent se demander "comment utilisez-vous votre DbContext?" "ne vous en disposer correctement?".

  • Je n'ai pas encore intégré le Printemps des transactions dans mon Gestionnaire de classes
  • Chaque objet qui effectue actions sur la base de données est un I<Entity>Manager l'extension de BaseManager
  • DbContext est une demande dans l'étendue du Ressort de l'objet. J'ai déjà interrogé sur l'élimination de demande d'objets dans l'étendue mais je suis actuellement mis en œuvre une solution de contournement, tandis que le mauvais, correctement dispose de la DbContext à la fin de la demande.

Exemple de code

public class ExampleManagerImpl : BaseManager, IExampleManager
{
    public void ActivateFlagFor(string aFlag, string[] aList)
    {
        string sql = "UPDATE table SET flag" + aFlag + " = 0";
        RunStatementV1(sql);

        if (aList != null && aList.Any())
        {
            sql = "UPDATE table SET flag" + aFlag + " = 1 WHERE id in (" + aList.ToCsvApex() + ")";
            RunStatementV1(sql);
        }
    }

    public IList<Models.Example> GetAll()
    {
        return DataContext.example.ToList(); //I don't dispose of the DataContext willingly
    }
}

et

public abstract class BaseManager {

    public DbContext DataContext { get; set; } //Autowired

    protected void RunStatementV1(string aSqlStatement)
    {
        IDbConnection connection = DataContext.Database.Connection;
        if (connection.State == ConnectionState.Closed || connection.State == ConnectionState.Broken) connection.Open(); //Needed because sometimes I found the connection closed, even if I don't dispose of it
        using (IDbCommand command = connection.CreateCommand())
        {
            command.CommandText = aSqlStatement;
            command.ExecuteNonQuery();
        }

    }
}

Ce que j'ai essayé

OriginalL'auteur usr-local-ΕΨΗΕΛΩΝ | 2015-01-30