2016-07-08 19 views
2
Aktualisieren

Ich habe eine LINQ-Abfrage, die ein einzelnes Objekt zurückgibt - der Kontext ist ein Object kein DbContextEntity Framework Object Context

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(); 

ich dann eine Sammlung an diese Befestigung durch die Verwendung der folgenden

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

Es gibt jedoch ein Problem, bei dem ich versuche, das geladene Objekt zu aktualisieren. Wenn Elemente in der Quellabfrage entfernt wurden, ändern sie sich bei der Aktualisierung nicht. Ich glaube, dass der Kontext jedes Objekt nur einmal lädt und zwischenspeichert aber ich muss den c behalten Ontext geöffnet, da ich zurück in die Datenbank speichern muss.

Ich habe versucht, die folgenden aufzufrischen mit:

context.Refresh(RefreshMode.StoreWins, y); 

oder das Auslösen einer Auslösung eines Refresh durch Setzen des Unternehmens Zustand geändert: Sie

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

Ich verstehe, dass mit einem DB-Kontext kann Aktualisieren Sie die Entität, die eine Datenbankaktualisierung erzwingt, meine Frage wäre, dass es möglich ist, die Aktualisierung mit ObjectContext zu erzwingen.

Mit DbContext konnten wir die gewünschten Ergebnisse erzielen, indem wir alles auffrischen, wie Sie sich vorstellen können, dass dies sehr langsam war.

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

Haben Sie versucht das? 'context.Entry (y) .Reload();' – lokusking

+0

objectcontext hat keine Eingabemethode http://stackoverflow.com/questions/11032683/objectcontext-does-not-contain-a-definition-for-entry-and -no-extension-metho – Chris

+0

Du hast Recht. Ich schaue in ein paar Stunden, wenn ich Zugang zu meinem EF-Projekt habe. – lokusking

Antwort

0

Nach this post, könnte dies helfen:

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

dies funktioniert auf einige unserer Fälle, einer insbesondere Wenn dies nicht funktioniert, wird eine Beziehung auf null gesetzt, dadurch wird sie nicht aktualisiert. Ich werde als die Antwort markieren, aber es ist immer noch unvollständig. – Chris

+1

Vielleicht nicht die Beziehung auf Null setzen. Stattdessen lösche sie oder entferne ein Element. Einen 'IEnumerable' auf 'null' zu setzen ist nie eine gute Idee – lokusking

+0

zugesprochene Prämie, wir werden versuchen, die zusätzlichen Ausgaben zu beheben, danke, Chris – Chris