web-dev-qa-db-fra.com

Comment forcer Entity Framework à toujours obtenir les données mises à jour de la base de données?

J'utilise EntityFramework.Extended library pour effectuer des mises à jour par lots. Le seul problème est que EF ne garde pas trace des mises à jour par lots effectuées par la bibliothèque. Ainsi, lorsque j'interroge à nouveau la variable DbContext, elle ne renvoie pas les entités mises à jour.

J'ai trouvé que l'utilisation de la méthode AsNoTracking() lors de l'interrogation désactive le suivi et extrait les nouvelles données de la base de données. Cependant, comme EF ne garde pas trace des entités interrogées avec AsNoTracking(), je ne peux effectuer aucune mise à jour des données interrogées.

Existe-t-il un moyen de forcer EF à obtenir les dernières données tout en suivant les modifications?

60
Saravana

Essayez ceci pour actualiser une seule entité:

Context.Entry<T>(entity).Reload()

Edit: Pour obtenir de nouvelles données pour une collection d’entités, essayez de supprimer l’instance DbContext après chaque requête.

114
PlTaylor

Je suis tombé sur cette question en cherchant une solution à un problème que je rencontrais lorsque les propriétés de navigation ne sont pas renseignées après la mise à jour de l'entité. Chaque fois que j'essayais de recharger l'entité à partir de la base de données, elle saisissait plutôt l'entrée du magasin local, ce qui ne renseignerait pas les propriétés de navigation via un chargement différé. Au lieu de détruire le contexte et d'en recréer un, j'ai trouvé que cela me permettait d'obtenir de nouvelles données avec le travail des mandataires:

_db.Entry(entity).State = EntityState.Detached;

La logique derrière cela était - ma mise à jour a attaché l'entité afin qu'elle puisse suivre les changements. Cela l'ajoute au magasin local. Par la suite, toute tentative d'extraction de l'entité avec des mandataires fonctionnels aurait pour résultat que celle-ci s'emparerait de l'entité locale au lieu d'aller à la base de données et de renvoyer une nouvelle entité activée par proxy. J'ai essayé l'option de rechargement ci-dessus, qui actualise l'objet à partir de la base de données, mais cela ne vous donne pas l'objet traité par proxy avec chargement paresseux. J'ai essayé de faire une Find(id), Where(t => t.Id = id), First(t => t.Id = id). Enfin, j'ai vérifié les états disponibles fournis et constaté qu'il y avait un état "Détaché". Eureka! J'espère que ça aide quelqu'un.

10
Zach

J'ai déclaré la variable d'entité, sans affectation, dans le cadre de la classe. Cela m'a permis de disposer d'une instance sans perdre la variable pour référence par d'autres méthodes. Je viens de découvrir cela, de sorte que le temps d'exécution n'est pas très long, mais jusqu'à présent, cela semble bien fonctionner.

public partial class frmMyForm
{
    private My_Entities entity;

    public frmMyForm()
    {
        InitializeComponent();
    }

    private void SomeControl_Click(object sender, EventArgs e)
    {
        db.SaveChanges();
        db.Dispose();
        entity = new My_Entities();
        //more code using entity ...
}
1
Scooter

Faire fonctionner le code dans le même contexte ne vous donnera pas les entités mises à jour. Il ajoutera uniquement les nouvelles entités créées dans la base de données entre les exécutions. Le rechargement de force EF peut être fait comme ceci:

ObjectQuery _query = Entity.MyEntity;
_query.MergeOption = MergeOption.OverwriteChanges;
var myEntity = _query.Where(x => x.Id > 0).ToList();
1
CodeMad

Pour moi, je peux accéder à mon DbContext comme ceci:

_viewModel.Repo.Context

Pour forcer EF à accéder à la base de données, procédez comme suit:

_viewModel.Repo.Context = new NewDispatchContext();

Remplacer le DbContext actuel par une nouvelle instance. La prochaine fois que j'utilise mes services de données, ils récupèrent les données de la base de données.

0
pdschuller