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 ?????
+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
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
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