2

J'ai une requête LINQ qui retourne un seul objet - le contexte est un ObjectContext pas DbContextEntity Framework objet Contexte Actualisez

var q = from c in context.x //this has various includes but this just an example 
where c.Id == xId 
select c; 

X x = q.FirstOrDefault(); 

Je joins alors une collection à cela en utilisant les éléments suivants

ObjectQuery<Z> y = x.Y.CreateSourceQuery().Include("1").Include("2"); 
x.Y.Attach(y); 

Cependant, il y a un problème lorsque j'essaie d'actualiser l'objet chargé et si des éléments attachés dans la requête source ont été supprimés, ils ne sont pas modifiés lors de l'actualisation. , mais je dois garder le c ontext ouvert car j'ai besoin de sauvegarder dans la base de données.

J'ai essayé de rafraîchir en utilisant les éléments suivants:

context.Refresh(RefreshMode.StoreWins, y); 

ou le déclenchement d'un déclenchement d'un rafraîchissement en définissant l'état d'entité modifiée:

context.ObjectStateManager.ChangeObjectState(pb, EntityState.Modified); 

Je comprends que dans un contexte de DB, vous pouvez rafraîchir l'entité en forçant un rafraîchissement de base de données, ma question serait est-il possible de forcer l'actualisation en utilisant ObjectContext. En utilisant DbContext, nous avons pu obtenir les résultats souhaités en rafraîchissant tout mais comme vous pouvez l'imaginer, c'était très lent.

var refreshableObjects = context.ChangeTracker.Entries().Select(e => e.Entity).ToList(); 
foreach (var obj in refreshableObjects) 
{ 
    ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.GetRelationshipManager(obj).GetAllRelatedEnds().Where(r => r.IsLoaded).ToList().ForEach(c => c.Load()); 
} 
+0

Avez-vous essayé? 'context.Entry (y) .Reload();' – lokusking

+0

objectcontext n'a pas de méthode d'entrée http://stackoverflow.com/questions/11032683/objectcontext-does-not-contain-a-definition-for-entry-and -no-extension-metho – Chris

+0

Vous avez raison. Je regarde dans quelques heures quand j'ai accès à mon EF-Project – lokusking

Répondre

0

Selon this post, cela pourrait aider:

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); 
} 
+0

cela fonctionne sur certains de nos cas, un en particulier Si cela ne fonctionne pas, la définition d'une relation sur null ne l'actualisera pas. Je vais marquer comme la réponse mais il est encore incomplet. – Chris

+1

Peut-être ne définissez pas de relation à null. Au lieu de les effacer ou supprimer un élément. Définir un 'IEnumerable' à' null' n'est jamais une bonne idée – lokusking

+0

récompensé la prime, nous allons essayer de résoudre les problèmes supplémentaires, merci, chris – Chris