Ich habe eine Viele-zu-viele-Beziehung Patienten - Patientengeräte - Geräte und ein grundlegendes edmx-Modell davon (keine poco, automatische Generierung). PatientDevices wird als Entität generiert, da es mehr Spalten als die Fremdschlüssel hat.Wie man einen zweiten ObjectContext mit Löschungen auf der ersten Ebene aktualisiert
Wenn ich zwei ObjectContexte erstellen und ein neues PatientDevice in das erste hinzufügen, hat das zweite auch das. Wenn diese Beziehung von dem ersten zu löschen, ist es immer noch in dem zweiten Kontext:
var entities1 = new TherapyDatabaseDevEntities();
var entities2 = new TherapyDatabaseDevEntities();
entities1.PatientDevices.AddObject(new PatientDevice
{
Patient = entities1.Patients.First(),
Device = entities1.Devices.First()
});
entities1.SaveChanges();
var relation1a = entities1.Patients.First().PatientDevices.ToList();
var relation2a = entities2.Patients.First().PatientDevices.ToList();
entities1.PatientDevices.DeleteObject(entities1.PatientDevices.ToList().Last());
entities1.SaveChanges();
var relation1b = entities1.Patients.First().PatientDevices.ToList();
var relation2b = entities2.Patients.First().PatientDevices.ToList();
relation1a und relation2a beide einen Eintrag haben. relation1b hat keinen Eintrag, aber relation2b hat einen Eintrag. Auch wenn mit Auffrischungen vor der Abfrage arbeiten:
entities2.Refresh(RefreshMode.StoreWins, entities2.Patients);
entities2.Refresh(RefreshMode.StoreWins, entities2.PatientDevices);
entities2.Refresh(RefreshMode.StoreWins, entities2.Devices);
var relation1b = entities1.Patients.First().PatientDevices.ToList();
// still 1 entry
var relation2b = entities2.Patients.First().PatientDevices.ToList();
Gibt es eine Möglichkeit, den zweiten Kontext zu bringen, auf dem Laufenden oder muss ich einen anderen Object schaffen?
bearbeiten
fand ich heraus, dass, wenn ich dies tun:
entities2.Refresh(RefreshMode.StoreWins, entities2.Patients.First().PatientDevices);
die Beziehung richtig aktualisiert wird. Es ist schade, dass ohne die Aktualisierung entities2.PatientDevices das gelöschte Objekt nicht mehr enthält, sondern entities2.Patients.First(). PatientDevices hat es immer noch.
Ist das beabsichtigte Verhalten?
Warum benötigen Sie zwei Kontexte gleichzeitig? Das ist sehr ungewöhnlich. – Steven
Wir haben eine Desktop-App, die Geräte in einem Listen-Steuerelement (erster Kontext) und Patienten-Tabs auflistet, wo Sie ein Gerät an einen Patienten anhängen können (zweiter Kontext). Wir haben verschiedene Kontexte, um Änderungen an einem Patienten rückgängig zu machen (Abbrechen-Taste) ==> Arbeitseinheitsmuster. –
Das Muster der Arbeitseinheit wird verwendet, um Änderungen in * mehreren Repositorys *, nicht * mehreren Kontexten * persistent zu machen. Sie können fast 2 Kontexte als 2 verschiedene Datenbanken betrachten (hypothetisch natürlich - da EF 2 Kontexte als möglicherweise 2 verschiedene Server annehmen wird). Steven hat recht, was Sie tun, ist sehr ungewöhnlich - Sie sollten die Entdeckungen in Ihrem Kontext über Repositories aufdecken und UoW verwenden, um diese Repositories zu verwalten. Nur 1 Kontext ist erforderlich. Warum brauchen Sie unterschiedliche Kontexte, um "Änderungen rückgängig zu machen"? Verwenden Sie den Rollback für Ihren Transaktionsbereich/UoW. – RPM1984