Entity Framework - actualise les objets de la base de données

database entity-framework objectcontext wpf

Question

J'ai des problèmes avec l'actualisation des objets dans ma base de données. J'ai un deux PC et deux applications.

Sur le premier PC, il y a une application qui communique avec ma base de données et ajoute des données à la table Measurements. Sur mon autre PC, il existe une application qui retransmet la dernière mesure sous un chronomètre. Elle doit donc également retracer les mesures ajoutées par l'application sur mon premier PC.

Le problème est que ce n'est pas le cas. Au démarrage de mon application, il met en cache toutes les données de la base de données et ne reçoit jamais de nouvelles données. J'utilise la méthode Refresh (), qui fonctionne bien lorsque je modifie les données mises en cache, mais n'actualise pas les données récemment ajoutées.

Voici ma méthode qui devrait mettre à jour les données:

    public static Entities myEntities = new Entities();

    public static Measurement GetLastMeasurement(int conditionId)
    {
        myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements);

        return (from measurement in myEntities.Measurements
                where measurement.ConditionId == conditionId
                select measurement).OrderByDescending(cd => cd.Timestamp).First();
    }

Les applications PS ont différentes chaînes de connexion dans app.config (différents comptes pour le même DB).

Réponse acceptée

Cela devrait fonctionner:

public static Entities myEntities = new Entities();

public static Measurement GetLastMeasurement(int conditionId)
{
    myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements);
    var allMeasurements = myEntities.Measurements.ToList();//retrieves all measurements from database

    return (from measurement in allMeasurements
            where measurement.ConditionId == conditionId
            select measurement).OrderByDescending(cd => cd.Timestamp).First();
}

Quel est le sens de la mise en cache lorsque vous actualisez le magasin chaque fois que vous souhaitez l’utiliser? Vous pouvez le changer pour:

public Measurement GetLastMeasurement(int conditionId)
{
    var entities = new Entities();
    return (from measurement in entities.Measurements
            where measurement.ConditionId == conditionId
            select measurement).OrderByDescending(cd => cd.Timestamp).First();
}

Il recherche également dans la base de données à chaque appel, mais effectue beaucoup moins d'opérations.


Réponse populaire

Depuis EF 4.1, vous pouvez utiliser la méthode AsNoTracking () sur vos entités.

return myEntities.Measurements.AsNoTracking();

Notez que AsNoTracking () n’ajoutera pas les entités à votre contexte pour le suivi, mais les renverra simplement à partir de votre magasin de données.

Pour plus d'informations, voir http://blogs.msdn.com/b/adonet/archive/2011/02/05/using-dbcontext-in-ef-feature-ctp5-part-11-load-and-asnotracking.aspx



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow