web-dev-qa-db-fra.com

Entity Framework Actualiser le contexte?

Comment pourrais-je rafraîchir mon contexte? J'ai des entités basées sur les vues de ma base de données et quand je fais une mise à jour sur une table Entité qui a des propriétés de navigation pour les vues, l'entité est mise à jour mais la vue ne s'actualise pas en fonction des nouvelles mises à jour ... je veux juste obtenir de nouveau le Db les données. Merci!

83
user2528557

Le meilleur moyen d'actualiser les entités dans votre contexte est de disposer de votre contexte et d'en créer un nouveau.

Si vous avez réellement besoin d'actualiser une entité et que vous utilisez l'approche Code First avec la classe DbContext, vous pouvez utiliser

    public static void ReloadEntity<TEntity>(
        this DbContext context, 
        TEntity entity)
        where TEntity : class
    {
        context.Entry(entity).Reload();
    }

Pour recharger les propriétés de navigation de la collection, vous pouvez utiliser

    public static void ReloadNavigationProperty<TEntity, TElement>(
        this DbContext context, 
        TEntity entity, 
        Expression<Func<TEntity, ICollection<TElement>>> navigationProperty)
        where TEntity : class
        where TElement : class
    {
        context.Entry(entity).Collection<TElement>(navigationProperty).Query();
    }

Référence: https://msdn.Microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry.reload (v = vs.113) .aspx # M: System.Data.Entity .Infrastructure.DbEntityEntry.Reload

79
RX_DID_RX
yourContext.Entry(yourEntity).Reload();
61
kravits88

Si vous souhaitez recharger des entités spécifiques, avec DbContextApi, RX_DID_RX vous a déjà donné la réponse.

Si vous souhaitez recharger/actualiser toutes les entités que vous avez chargées:

Si vous utilisez Entity Framework 4.1+ (EF5 ou EF 6 probablement), API DbContext:

public void RefreshAll()
{
     foreach (var entity in ctx.ChangeTracker.Entries())
     {
           entity.Reload();
     }
}

Si vous utilisez entityFramework 4 (API ObjectContext):

public void RefreshAll()
{
     // Get all objects in statemanager with entityKey
     // (context.Refresh will throw an exception otherwise)
     var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted
                                               | EntityState.Modified
                                               | EntityState.Unchanged)
                                      where entry.EntityKey != null
                                      select entry.Entity);

     context.Refresh(RefreshMode.StoreWins, refreshableObjects);
}

Le meilleur conseil à faire est quand même d'essayer d'utiliser un "contexte de courte durée" et vous éviterez ce genre de problèmes.

J'ai écrit quelques articles sur le sujet:

https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

24
Christian Rodriguez

Utilisez la méthode Refresh :

context.Refresh(RefreshMode.StoreWins, yourEntity);

ou alternativement, définissez votre contexte actuel et créez-en un nouveau.

13
Alberto

context.Reload () ne fonctionnait pas pour moi dans MVC 4, EF 5, donc je l'ai fait.

context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);

et ça fonctionne bien.

L'actualisation du contexte de base de données avec Reload n'est pas recommandée en raison de pertes de performances. Il est suffisant et la meilleure pratique d’initialiser une nouvelle instance de dbcontext avant chaque opération exécutée. Il vous fournit également un contexte actualisé et actualisé pour chaque opération.

using (YourContext ctx = new YourContext())
{
   //Your operations
}
0
aog

EF 6

Dans mon scénario, Entity Framework ne récupérait pas les données nouvellement mises à jour. La raison pourrait être que les données ont été mises à jour en dehors de leur portée. L'actualisation des données après la récupération a résolu mon problème.

private void RefreshData(DBEntity entity)
{
    if (entity == null) return;

    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entity);
}

private void RefreshData(List<DBEntity> entities)
{
    if (entities == null || entities.Count == 0) return;

    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entities);
}
0
Mahbubur Rahman