2013-06-27 17 views
5

Ich habe schon eine Weile gesucht und nichts, was ich finden kann funktioniert. Ich habe eine Situation, in der ich zwei Objekte habe (siehe Definition unten). Das untergeordnete Objekt ist eine Sammlung auf dem übergeordneten Objekt. Ich arbeite in Visual Studio 2012 mit WPF/Prism und Entity Framework 4,4Entity Framework 4.4, neu laden Child Collection Objekte

class Parent 
{ 
    ...other properties... 
    public virtual ICollection<Child> Children { get; set; } 
} 

class Child 
{ 
    public string Value1 { get; set } 
    public string Value2 { get; set } 
    public string Value3 { get; set } 
} 

Ich habe ein Formular, das die Eltern Laden in ein Listenfeld auf der linken Seite und der Benutzer klickt auf eines der Elemente hat in Die Liste und wir zeigen die Eigenschaften auf der rechten Seite. Alles funktioniert gut, bis wir zwei Maschinen haben, die die gleiche Datenbank treffen. Wenn ein Computer einen der Datensätze hinzufügt oder aktualisiert, habe ich Probleme mit dem zweiten Rechner, der die Daten erhält ...

Ich habe den folgenden Code zu versuchen und zu beheben, aber es scheint, als sollte es einen einfachen Weg geben innerhalb des Entitätsrahmens.

DbEntityEntry<Parent> entry = dbContext.Entry(parent); 
entry.Reload(); //Note: this refreshes the properties on the Parent object (but not the collection 

if (Parent.Children != null) 
{ 
    Array a = doc.Children.ToArray<Child>(); //this is here because they may have deleted one of the records 

    foreach (Child g in a) 
    { 
     DbEntityEntry<Child> c= dbContext.Entry(g); 
     c.Reload(); //Note: if it is deleted, the Parent.Child gets updated automatically to remove the record. 
    } 
} 

entry.Collection(o => o.Children).Load(); //call this to get new records 

Irgendwelche Gedanken ich auf, was ich besser machen kann oder ist das der Weg, es zu tun ?????

+0

+1, weil ich es eine gute Lösung finde (und ich erfuhr, dass 'Reload' entfernt gelöschte Entitäten aus der Child-Sammlung). Ich bezweifle, dass Sie dies in einen einfachen Einliner oder so komprimieren können. Das Aktualisieren/Aktualisieren von Objektdiagrammen ist mit EF selten einfach. – Slauma

+0

Eines der Probleme, die ich mit meiner Lösung habe, ist, dass ich in meinem tatsächlichen Code 4-5 dieser Arten von Sammlungen habe. Scheint so, als ob das erste Reload auch alle untergeordneten Sammlungen neu laden sollte, oder zumindest die ntry.Collection (o => o.Children) .Load(); sollte vielleicht einen "Reload" hat statt gefunden – adondero

+1

einen besseren Weg, um die foreach oben auf dem Array '((IObjectContextAdapter) DbContext) .ObjectContext.Refresh (RefreshMode.StoreWins, parent.Children) zu tun;' diese entfernt Einträge und aktualisiert aktuelle. brauche immer noch die .Load(), um neue Datensätze zu erhalten. Dies scheint auch viel schneller zu sein. – adondero

Antwort

12

diese

auf eine Antwort Verschoben einen besseren Weg gefunden, die „foreach“ oben auf dem Array

((IObjectContextAdapter)dbContext).ObjectContext.Refresh(RefreshMode.StoreWins, parent.Children); 

diese entfernt Einträge und aktuelle, aktualisiert zu tun. brauche immer noch die .Load(), um neue Datensätze zu erhalten. Dies scheint auch viel schneller zu sein auch