J'ai une relation many-to-many Patients - PatientDevices - Dispositifs et un modèle edmx de base (pas de poco, génération automatique). PatientDevices est généré en tant qu'entité, car il contient plus de colonnes que les clés étrangères.Comment mettre à jour un second ObjectContext avec des suppressions effectuées sur le premier
Lorsque je crée deux ObjectContexts et que j'ajoute un nouveau PatientDevice dans le premier, le second l'a également. Lors de la suppression de cette relation de la première, il est encore dans le second contexte:
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 et relation2a ont tous deux une entrée. relation1b n'a pas d'entrée, mais relation2b a une entrée. Même si vous travaillez avec avant que la requête rafraîchit:
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();
Est-il possible d'amener le second contexte à jour ou dois-je créer un autre ObjectContext?
Modifier
Je trouve que si je fais ceci:
entities2.Refresh(RefreshMode.StoreWins, entities2.Patients.First().PatientDevices);
la relation est mis à jour correctement. Il est dommage que sans l'actualisation entity2.PatientDevices ne contienne plus l'objet supprimé, mais entities2.Patients.First(). PatientDevices l'a toujours.
Est-ce un comportement prévu?
Pourquoi avez-vous besoin de deux contextes en même temps? C'est très inhabituel. – Steven
Nous avons une application de bureau qui répertorie les appareils dans un contrôle de liste (premier contexte) et les onglets patient où vous pouvez attacher un appareil à un patient (deuxième contexte). Nous avons différents contextes pour annuler les modifications apportées à un patient (bouton d'annulation) ==> unité de motif de travail. –
Le motif Unité de travail est utilisé pour conserver les modifications dans * dépôts multiples *, et non * contextes multiples *. Vous pouvez presque penser à 2 contextes comme 2 bases de données différentes (hypothétiquement bien entendu - puisque EF assumera 2 contextes comme éventuellement 2 serveurs différents). Steven a raison, ce que vous faites est très inhabituel - vous devriez exposer les entites dans votre contexte via des dépôts et utiliser UoW pour gérer ces dépôts. Un seul contexte est requis. Pourquoi avez-vous besoin de différents contextes pour "annuler les changements". Utilisez la restauration sur votre périmètre de transaction/UoW. – RPM1984